使用pthread线程库时,应该包含头文件pthread.h
#include <pthread.h>
编译时需要加上 -lpthread链接该库
创建线程使用接口
int pthread_create(pthread_t *tidp,
const pthread_attr_t * attr,
void *(*start_rtn)(void),
void *restrict arg);
第一个参数tidp为类型为pthread_t的指针,代表线程的tid
第二个参数attr为设置线程属性的结构体pthread_attr指针,不需要设置可以置为NULL
第三个参数start_rtn为void* (void*) 类型的函数指针,就是线程的入口函数了
第四个参数restrict_arg为线程入口带的参数,因为是(void*)所以通过类型强制转换可以是任何参数
类似这样:
void *routine1(void *arg)//线程入口函数
{
int* para=(int*) arg;//强制转换参数,这里假设传的是一个整数
printf("para=%d",*para);
while(1)
sleep(1);
}
创建多条线程时,对共享资源的使用时,需要用锁加以限制,这里推荐使用pthread库的读写锁,使用也非常简单:
pthread_rwlock_t rwlock;//定义一个读写锁,一般定义为全局变量
global num = 0;
func()
{
int i;
pthread_rwlock_init(&rwlock, NULL);//读写锁初始化
pthread_rwlock_rdlock(&rwlock);//加读锁
num==0?i=1:i=0;//读取共享资源
pthread_rwlock_unlock(&rwlock);//解读锁
pthread_rwlock_wrlock(&rwlock);//加写锁
num++;//写共享资源
pthread_rwlock_unlock(&rwlock);//解写锁
pthread_rwlock_unlock(&rwlock);//不用时记得销毁
}
完整的简单使用范例如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdbool.h>
#include <errno.h>
#include <pthread.h>
pthread_rwlock_t rwlock;
int global = 0;
void *routine1(void *arg)
{
//============ WRITE lock ============//
pthread_rwlock_wrlock(&rwlock);
global += 1;
printf("I am %s, now global=%d\n", (char *)arg, global);
sleep(1);
pthread_rwlock_unlock(&rwlock);
//=========== WRITE unlock ===========//
pthread_exit(NULL);
}
void *routine2(void *arg)
{
//============ WRITE lock ============//
pthread_rwlock_wrlock(&rwlock);
global = 100;
printf("I am %s, now global=%d\n", (char *)arg, global);
sleep(1);
pthread_rwlock_unlock(&rwlock);
//=========== WRITE unlock ===========//
pthread_exit(NULL);
}
void *routine3(void *arg)
{
//============ READ lock ============//
pthread_rwlock_rdlock(&rwlock);
printf("I am %s, now global=%d\n", (char *)arg, global);
sleep(1);
pthread_rwlock_unlock(&rwlock);
//=========== READ unlock ===========//
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_rwlock_init(&rwlock, NULL);
pthread_t t1, t2, t3;
pthread_create(&t1, NULL, routine1, "thread 1");
pthread_create(&t2, NULL, routine2, "thread 2");
pthread_create(&t3, NULL, routine3, "thread 3");
pthread_join(t1, NULL);
pthread_join(t2, NULL);
pthread_join(t3, NULL);
pthread_rwlock_destroy(&rwlock);
return 0;
}
其中,
pthread_exit(NULL);为线程退出的函数,可以带上自己想返回给主线程的参数,如:
pthread_exit("thread1 exit!");
在主线程使用 pthread_join() 来接合子线程获取返回的参数,如:
void *dead_str;
pthread_join(tid1, &dead_str);
printf("%s",(char*) dead_str);//假设返回的是字符串