pthread是linux下C语言执行多线程操作的基础,操作多线程的操作全部在pthread.h头文件中,跟线程密切相关的操作包括创建、退出以及主线程的等待。
一、创建线程
int pthread_create(pthread_t* thread,pthread_attr_t* attr,void* (*start_routine)(void* arg),void* arg)
1、参数
函数的第一个参数返回的是一个线程的指针,该指针唯一的标识创建的线程。
参数attr用来设置线程的属性,一般我们设置为NULL,即采用系统的默认设置。
第三个参数是线程将要执行的方法,或者说是线程的主体,该参数是一个函数指针,参数和返回值都是void*类型。
第四个参数是第三个参数代表的方法所需要的参数。
2、返回值
当创建线程成功时,该方法返回一个不为0的int。
二、离开线程(销毁线程)
void pthread_exit(void* retval)
该方法离开该线程,并且返回一个指向某个对象的指针(该指针不能用来指向一个局部变量,因为离开线程之后,线程被销毁,资源被释放)
三、等待线程
1、在绝大多数情况下,我们需要在主线程中等待子进程的完成,然后执行后续操作,这样我们就需要pthread_join函数来完成任务。
2、该方法类似于fork中的wait,但不同的是,该方法面向的对象是线程而非进程,主线程会一直挂起,直到等待的子线程返回。
int pthread_join(pthread_t t,void** thread_return)
参数t表示等待的子线程的唯一标识。
参数thread_return是一个void*值的地址,该参数得到的是线程的返回数据,即为pthred_exit中的参数值。
四 、示例
在主线程中创建一个线程,然后等待子线程完成,并且在子线程中修改了一个全局变量message,然后等子线程返回后在重新打印message的值。
#include <stdio.h>
#include <pthread.h>
#include <string.h>char message[] = "hello word!";
void *threadTest(void *arg)
{printf("test thread is running, the argument is: %s\n", (char*)arg);strcpy(message,"good bye!");pthread_exit("thank you for cpu time!");
}
int main()
{pthread_t threadID;void *threadRes;int res;res = pthread_create(&threadID, NULL, threadTest, (void *)message);if (res != 0){printf("pthread creat error!\n");}printf("waiting test thread finish.\n");res = pthread_join(threadID, &threadRes);if (res != 0){printf("pthread join error!\n");}printf("pthread join result is: %s\n", (char *)threadRes);printf("message now is: %s\n", message);pthread_exit(NULL);return 0;
}
运行:gcc thread.c -o test -lpthread
waiting test thread finish.
test thread is running, the argument is: hello word!
pthread join result is: thank you for cpu time!
message now is: good bye!