#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#define THEARD_NUMBER 3
#define REPEAT_NUMBER 5
#define DELAY_TIME_LEVELS 10.0
void *thrd_func(void *arg){
int thrd_num=(int)arg;
int delay_time=0;
int count=0;
printf("Theard %d is starting\n",thrd_num );
for(count=0;count<REPEAT_NUMBER;count++){
delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX))+1;
sleep(delay_time);
printf("\tThreard %d : job %d delay = %d\n",thrd_num,count,delay_time );
}
printf("Theard %d finished\n",thrd_num );
}
int main(void){
pthread_t thread[THEARD_NUMBER];
int no=0,res;
void *thrd_ret;
srand(time(NULL));
for (no = 0; no < THEARD_NUMBER; no++){
res=pthread_create(&thread[no],NULL,thrd_func,&no);
if(res!=0){
printf("Create thread %d failed\n",no );
exit(res);
}
}
printf("Create threads success \n Waiting for threads to finish......\n");
for(no=0;no<THEARD_NUMBER;no++){
res=pthread_join(thread[no],&thrd_ret);
if(!res){
printf("Theard %d joined\n",no );
}else{
printf("Theard %d join failed\n",no );
}
}
return 0;
}
这里主函数第一个for循环pthread()的最后一个参数可能不同版本的linux写法上会有所不同,我的是ubuntu14.04,要写成&no,red Hat下可以写为(void*)
代码编写没有问题,但是在gcc 编译的时候会报错
# gcc thread.c
thread.c: In function ‘thrd_func’:
thread.c:9:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
int thrd_num=(int)arg;
^
/tmp/cc3Y8DeX.o:在函数‘main’中:
thread.c:(.text+0xff):对‘pthread_create’未定义的引用
thread.c:(.text+0x163):对‘pthread_join’未定义的引用
collect2: error: ld returned 1 exit status
网上找到了原因,原来pthread不是linux的默认库中的文件,所以无法直接使用,需要在后面加上-lpthread
# gcc thread.c -o test -lpthread
thread.c: In function ‘thrd_func’:
thread.c:9:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
int thrd_num=(int)arg;
^
这里出现一个警告也没关系,编译能够通过就行,具体什么原因我也不知道。
运行test文件即可得到结果
./test
Create threads success
Waiting for threads to finish......
Theard 878785664 is starting
Theard 878785664 is starting
Theard 878785664 is starting
Threard 878785664 : job 0 delay = 5
Threard 878785664 : job 0 delay = 10
Threard 878785664 : job 0 delay = 10
Threard 878785664 : job 1 delay = 4
Threard 878785664 : job 1 delay = 10
Threard 878785664 : job 1 delay = 6
Threard 878785664 : job 2 delay = 2
Threard 878785664 : job 2 delay = 5
Threard 878785664 : job 3 delay = 4
Threard 878785664 : job 2 delay = 6
Threard 878785664 : job 3 delay = 4
Threard 878785664 : job 4 delay = 4
Theard 878785664 finished
Threard 878785664 : job 3 delay = 7
Threard 878785664 : job 4 delay = 8
Theard 878785664 finished
Theard 0 joined
Theard 1 joined
Threard 878785664 : job 4 delay = 6
Theard 878785664 finished
Theard 2 joined