并发可能导致的问题

同一个进程下的多线程是多个独立的执行流,它们会并发地访问共享资源,这种情况下可能会出现问题:

#include <47func.h>	//系统目录下自定义的头文件(包含下面函数所需的头文件)

int global = 0;		// 共享资源

void* threadFunc(void* arg)
{
    global++;
}

int main()
{
    pthread_t tid;
    pthread_create(&tid,NULL,threadFunc,NULL);
    //sleep(1);
    global++;
    
    printf("global = %d\n",global);
    return 0;

}

若main线程中不加sleep函数,打印出来global的值为 1 ;加sleep函数,打印出来为2。

父子线程并发访问共享资源,若不加sleep函数,则在子线程进行自增操作的过程中,由于CPU的调度被打断,打断后执行main线程的自增操作,自增后,将结果写回内存,随后继续子线程的自增操作,完毕后再此写回内存,这样其实只是完成了一次+1,第二次只是将原来的结果覆盖罢了。sleep 1 秒后,可以控制让两个线程异步的进行,这时才会达到自增两次的效果。

posted @ 2023-02-28 23:33  MyXjl  阅读(16)  评论(0编辑  收藏  举报