GCC 过度优化 导致程序BUG

为什么 这段代码的 “Hello World” 不能输出.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_THREADS 4
#define ATOMIC_ADD_FETCH(a) __sync_add_and_fetch(a, 1) //原子 变量自增
#define ATOMIC_SUB_FETCH(a) __sync_sub_and_fetch(a, 1) //原子 变量自减

static int thread_count = 0;

void* run_start(void* arg)
{
ATOMIC_ADD_FETCH(&thread_count);
pthread_exit(NULL);
return NULL;
}

int main(int argc, char* argv[])
{
int i = 0;
pthread_t thread_list[MAX_THREADS];

for(i = 0; i < MAX_THREADS; i++)
{
pthread_create(thread_list + i, NULL, run_start, (void*)(size_t)i);
}

while(MAX_THREADS != thread_count);

printf("Hello World\n");

return 0;
}

编译运行

1
2
3
4
5
6
7
8
9
10
11
12
chunli@blog:/tmp$ gcc -O3 main.c -lpthread && ./a.out

^C
chunli@blog:/tmp$ gcc -O2 main.c -lpthread && ./a.out

^C
chunli@blog:/tmp$ gcc -O1 main.c -lpthread && ./a.out

^C
chunli@blog:/tmp$ gcc -O0 main.c -lpthread && ./a.out
Hello World
chunli@blog:/tmp$

结论

没有优化的代码. 是可以的运行的.