Linux Pthread_join使用

这个函数没有什么好说的。其实就两个参数,第一个是线程变量,第二个是线程返回值。其函数原型为:

int pthread_join(pthread_t thread,void** result);

不过查阅许多网上资料,依旧没有使用result这个形参的。一般的使用为pthread_join(thread,NULL);于是自己在想那个NULL能做啥米用
。于是写下下面的代码:

#include <stdio.h> #include <pthread.h> int count =0; // 初始化mutex变量。
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; void * print_count(int);
int main() { const int num = 10; pthread_t threads[num]; int i=0; for(i=0; i<
num; i++){ //第一个参数是pthread_t变量,第二个是pthread_t变量的属性
//第三个是pthread_t需要执行的函数,其函数原型为 // void* (startfun)(void) //
所以传入的是一个返回void的函数(这里当然可以转换) // 并且接受的是void的参数,所以需要把i转换为void *
pthread_create(&threads[i],NULL,print_count,(void*)i); } void* result = NULL;
for(i=0; i < num; i++){ // 这里就是同步得到结果。打印的是线程执行的状态,0为成功。非0失败 printf(“end
%d;/n”,pthread_join(threads[i],&result)); if(result == NULL){
printf(“NULL/n”); } else{ // 这里打印的是pthread_t执行完print_count后返回的结果。
printf(“%x/n”,result); } } return 0; }
//这里返回的类型是void*,因为pthread_create中的函数指针为void* //这里的参数int
i,可有可无,如果没有pthread_create中就使用NULL作为参数。 void * print_count(int i){ // 设置mutex锁
pthread_mutex_lock(&mutex); printf(“thread: %d—> count %d/n”,i,count);
count++; sleep(2); printf(“thread: %d—> count %d/n”,i,count); // 释放锁
pthread_mutex_unlock(&mutex); //这里是返回值, void * result就可以被赋值了…否则为result = NULL
return (void*)count; }

另外值得注意的是pthread_join()中第二个参数不要乱传。如果非NULL,可能造成segment failure.

另外这里如果使用c进行编译可能会有void*
()(int)不能转换为void()(void)的问题。这是因为c
编译器要求太严格了。只好改动函数签名为void *
print_count(void *);之后再进行转换。现在终于知道为啥这么多人都喜欢在linux下使用c了。