gpt4 book ai didi

c - 假设线程的执行顺序 - 陷阱和更正

转载 作者:太空宇宙 更新时间:2023-11-04 09:50:10 26 4
gpt4 key购买 nike

我看到了示例代码。

assuming_order_of_execution_pitfall.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define N 4

void* hello(void* arg)
{
printf("Hello World from Thread%d\n", *(int*)arg);
return NULL;
}

int main()
{
pthread_t tid[N];
int i;

for(i = 0; i < N; i++)
{
pthread_create(&tid[i], NULL, hello, (void*)&i); //&i points to same address
}

for(i = 0; i < N; i++)
{
pthread_join(tid[i], NULL);
}

return 0;
}

在这里,它错误地假设线程在创建时就开始执行。 printf() 语句可能确实在下一次调用 pthread_create() 之前执行,但操作系统可以自由地以任何顺序安排线程。有可能所有线程都在它们中的任何一个实际开始执行之前创建。由于 arg 的所有副本都指向相同的地址,该地址在 main() 中发生变化,因此线程可以打印相同的 identification number

我已经尝试通过使用唯一地址来保存每个线程的标识号来更正上面的代码,如下所示

assuming_order_of_execution_workaround.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define N 4

void* hello(void* arg)
{
printf("Hello World from Thread%d\n", *(int*)arg);
return NULL;
}

int main()
{
pthread_t tid[N];
int tno[N];
int i;

/* Added code */
for(i = 0; i < N; i++)
{
tno[i] = i + 1;
}/* Added code */

for(i = 0; i < N; i++)
{
pthread_create(&tid[i], NULL, hello, (void*)(tno+i)); // providing unique address for each thread
}

for(i = 0; i < N; i++)
{
pthread_join(tid[i], NULL);
}

return 0;
}

我的修正方法正确吗?如果有的话,有人可以建议我一种更正确的方法吗?

最佳答案

是的,这是正确的方法。

关于c - 假设线程的执行顺序 - 陷阱和更正,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12000616/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com