C语言的线程库
-
在Linux系统上,可使用pthread.h的API创建线程。比如pthread_create()。
- pthread.h符合POSIX标准,适用于类Unix、Linux系统。也有兼容Windows的版本——pthreads-w32。
- 编译时要链接pthread库,比如:gcc test.c -o test -l pthread
-
C11制定了一个标准的线程库threads.h,但部分编译器不支持它。
pthread.h的API
官方API列表:https://www.sourceware.org/pthreads-win32/manual/index.html
这里列出几个常用API:
pthread_t // 一种数据类型,用于存储线程ID
int pthread_create(pthread_t *id, // 传入一个pthread_t类型的变量的地址
const pthread_attr_t * attr, // 传入线程的属性(传入NULL则是默认属性)
void *(*) (void *), // 传入要运行的函数名
void *arg); // 传入要运行的函数的参数(没有参数则填NULL,有多个则封装成一个结构体)
功能:创建一个线程来运行一个函数。
线程创建成功后会将该线程的ID存储到变量id中,并返回0。线程创建失败时会返回非零值。
要运行的函数应该定义成 void *fun(void *arg) 的格式。
int pthread_join(pthread_t id, void **retval);
功能:暂停当前线程的运行,等待id所指的线程终止。当它终止之后,其返回值会存储在retval变量中。
int pthread_cancel(pthread_t id);
功能:向某个线程发送取消请求,请它结束运行。
目标线程可能立即终止,也可能稍后终止,也可能忽略取消请求。
pthread.h的示例
这里创建两个线程,分别运行两个函数:
#include <stdio.h>
#include <pthread.h>
void *fun1(){ // 没有参数
puts("fun1() end."); // 显示一些信息,便于判断多个线程的结束顺序
return 0;
}
typedef struct{
int age;
char name[10];
} Horse;
void *fun2(void *p){ // 用一个结构体传入参数
Horse h = *(Horse *)p;
printf("age: %d, name: %s.\n", h.age, h.name);
puts("fun2() end.");
return 0;
}
int main(){
int rc;
pthread_t id;
// 创建第一个线程
rc = pthread_create(&id, NULL, fun1, NULL);
if (rc)
puts("Failed to create the thread fun1().");
// 创建第二个线程
Horse horse = {5, "Jack"};
rc = pthread_create(&id, NULL, fun2, &horse);
if (rc)
puts("Failed to create the thread fun2().");
// 阻塞主线程的运行,以免主线程运行结束时提前终止子线程
pthread_join(id, NULL);
puts("main() end.");
return 0;
}
编译运行: