c - 为什么竞争条件会在循环中发生?

标签 c pthreads race-condition

<分区>

我有一个代码来模拟串行与并行计算。但是,它似乎存在竞争条件。

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

void *foo(void *para) {
    printf("This is Thread %d running...\n", *(size_t *)para);
    fflush(stdout);
    sleep(2);
}

int main(void)
{
    /* loop version
    for (size_t i = 0; i < 4; i++) {
        foo((void *)&i);
    }
    */

    pthread_t pool[4];
    for (size_t i = 0; i < 4; i++) {
        pthread_create(&pool[i], NULL, foo, (void *)&i);
    }

    for (size_t i = 0; i < 4; i++) {
        pthread_join(pool[i], NULL);
    }

    return 0;
}

输出:

[william@Notebook Downloads]$ time ./a.out 
This is Thread 1 running...
This is Thread 2 running...
This is Thread 4 running...
This is Thread 3 running...

real    0m2.003s
user    0m0.003s
sys     0m0.000s

[william@Notebook Downloads]$ time ./a.out 
This is Thread 3 running...
This is Thread 3 running...
This is Thread 2 running...
This is Thread 4 running...

real    0m2.003s
user    0m0.003s
sys     0m0.000s

大多数竞争条件发生的例子是当你有多个线程试图写一个共享值时。但是,这段代码中根本没有写操作。那么,为什么会这样呢?是因为for循环没有按顺序执行吗?

最佳答案

虽然前面的答案解决了您的代码问题,但这并不是您所问问题的原因,正如其作者所假设的那样。

问题是您将相同的参数传递给每个线程。线程正在打印当时 i 恰好是什么,一个你不断变化的值。 i 在线程尝试访问它时甚至可能不存在。

您需要传递不同的指针,而不是每次都传递相同的指针(例如,只为线程分配的东西,或者指向保证比线程长的数组的不同元素的指针)。或者,由于指针本身已被复制,您可以将足够小的整数转换为指针,然后让线程将指针转换回整数。

关于c - 为什么竞争条件会在循环中发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56310305/

相关文章:

c - 带有 pthread 的 Buddhabrot 分形

operating-system - 单处理器环境可以防止竞争条件吗?

c++ - std::exception_ptr 线程安全吗?

c# - HttpContent:已添加具有相同键的项目

c - 使用 "$**"在 Makefile 中直接输入文件

c++ - 如何使用 libgit2 编写正确的 git pull

c - Posix 线程锁定 : waiting forever

Dev-Cpp 中的 C 代码在运行时中断

c - 从串行端口读取时如何实现 read() 超时(C/C++)

c - 简单 Pthread 例程中的 GDB 断点?