为什么在单核CPU上跑这段多线程代码会出错?
如图所示的代码,在test函数中通过for循环对主线程传递进来的引用变量i进行递增1000000000次,最后两个线程跑完之后应该是2000000000。按道理在单核CPU上,多线程不也是会变成两个线程交替执行的串行执行吗?为什么结果数据却不一样呢?
void *test(void *i){
int *j = (int *)i;
for (int i = 0; i < 1000000000; ++i)
{
(*j)++;
}
return ((void *)0);
}
int main(int argc, char const *argv[])
{
int i = 0;
pthread_t tid1;
pthread_t tid2;
int err1 = pthread_create(&tid1, NULL, test, (void *)&i);
int err2 = pthread_create(&tid2, NULL, test, (void *)&i);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf("%d\n", i);
return 0;
}
回答:
因为自增需要三步操作,读*j
,+1,写*j
。
在单核CPU,如果按下列顺序执行:
线程1:读*j
线程2:读*j
线程1:+1,写回*j
线程2:+1,写回*j
线程1的自增就会被线程2覆盖。
回答:
i这个变量没有上锁
当两个线程同时去读取和修改i时,将出现竞争的情况
可以声明一个pthread_mutex_t互斥锁锁,使用互斥锁去锁住变量pthread_mutex_lock()
以上是 为什么在单核CPU上跑这段多线程代码会出错? 的全部内容, 来源链接: utcz.com/p/192387.html