<分区>
我有一个代码来模拟串行与并行计算。但是,它似乎存在竞争条件。
#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循环没有按顺序执行吗?