c - 动态创建线程并传递一个整数

标签 c multithreading unix pthreads

我有一个进程,它根据传递给进程的参数创建多个线程。

producer_threads[num_threads];
for (id = 0; id < num_threads; id++)
{
    printf("%d\n", id);
    pthread_create(&producer_threads[id], NULL, &produce, (void *) &id);
}

每个线程进入一个生成函数并将 id 存储为局部变量

void* produce (void* args)
{
    int my_id = * (int*) args;
    printf("Thread %d started to produce\n", my_id);
}

但是我收到的输出如图所示

0
1
Thread <n> started to produce
Thread <n> started to produce

和 n 随机为 0、1 或 2。我不确定是什么导致了问题,除非是因为全局变量在本地分配之前已被更新。或者因为“局部变量”是在线程之间共享的。

最佳答案

问题在于您将指向相同变量的指针传递给每个线程。这会产生竞争条件,每个线程看到的变量值取决于确切的计时。

如果您要按值而不是指针传递线程参数,这将解决问题。

关于c - 动态创建线程并传递一个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10904596/

相关文章:

c - gdb -- 没有名为 <something> 的源文件 - 英特尔编译器

C 程序 (Visual Studio) 中有关 Malloc 的编译错误(类型 "void*"的值不能用于初始化类型 "Item*"的实体

c++ - DRD 在 std::mutex::lock 上报告 "conflicting load"错误

c - 使用 pthread 创建多个线程时出现问题

perl - 从远程服务器获取文件 - Perl/Unix

c - 了解 UNIX fork() 如何影响父进程

c - 为标准输入中输入的每一行打印行号

c - Frama-c [内核] 用户错误 : Length of array is zero. 不支持此扩展

C# .Net 在分离线程和应用程序退出中接收 UDp 数据包

c - 当我运行它时,此代码不执行任何操作。为什么?