一個Linux pthread 小例子:
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <fcntl.h>#include <string.h>int count = 0;void* pthread_fun(void* ptr){ count++; sleep(1); printf("count: %d\n", count); return ptr;}int main(int argc, char* argv[]){ int num = 20; int i = 0; int ret = 0; void* pt_ret[64]; pthread_t pt_id[64]; for(i=0; i<=num; i++) { ret = pthread_create(&pt_id[i], NULL, pthread_fun, NULL); if(ret != 0) { perror("pthread_create failed"); } } for(i=0; i<=num; i++) { ret = pthread_join(pt_id[i], &pt_ret[i]); if(ret != 0) { perror("pthread_join failed"); } } return 0;}
編譯運行:
gcc -o test -lpthread test.c./test
It seems OK !
但是改成這樣後,就有問題了:
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <fcntl.h>#include <string.h>void* pthread_fun(void* ptr){ int count = *ptr; printf("count: %d\n", count); sleep(1); return ptr;}int main(int argc, char* argv[]){ int num = 20; int i = 0; int ret = 0; void* pt_ret[64]; pthread_t pt_id[64]; for(i=0; i<=num; i++) { ret = pthread_create(&pt_id[i], NULL, pthread_fun, &i); if(ret != 0) { perror("pthread_create failed"); } } for(i=0; i<=num; i++) { ret = pthread_join(pt_id[i], &pt_ret[i]); if(ret != 0) { perror("pthread_join failed"); } } return 0;}
編譯錯誤:
# gcc -o test -lpthread test.c tmp.c: In function ‘pthread_fun’:tmp.c:10: warning: dereferencing ‘void *’ pointertmp.c:10: error: void value not ignored as it ought to be
錯誤原因排查中... ...