一个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 *’ pointer
tmp.c:10: error: void value not ignored as it ought to be
错误原因其实和thread没有关系,而是因为ptr是void*类型,不能使用*ptr去取值。
可以改成这样:
int *myptr = ptr;
int count = *myptr;
或者通过类型转换:
int count = *(int*)ptr;