为什么在单核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

回到顶部