线程相关函数
函数名称 | 函数原型 |
---|---|
线程创建:pthread_create | int pthread_create(pthread_t *thread, const pthread_attr_t *attr,oid *(*start_routine) (void *), void *arg); //线程ID、线程属性、线程函数、线程参数 |
线程等待:pthread_join | pthread(pthread_t pthread, void *retval) //线程ID、线程退出信息 |
线程退出:pthread_exit | pthread_exit(void* exit_status); |
线程ID获取:pthread_self | pthread_self () |
线程互斥锁初始化:pthread_mutex_init | pthread_mutex_init (pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)//一线程加锁成功之后,其他申请加锁的线程处于等待 |
线程加锁:pthread_mutex_lock | pthread_mutex_lock (pthread_mutex_t *mutex)//一线程加锁成功之后,其他申请加锁的线程处于等待 |
线程尝试加锁:pthread_mutex_trylock | pthread_mutex_trylock (pthread_mutex_t *mutex)//一线程尝试加锁,如果失败不挂起等待 |
线程解锁:pthread_mutex_unlock | pthread_mutex_unlock (pthread_mutex_t *mutex)//一线程释放锁之后,其他申请加锁的线程按照优先权获取该锁 |
线程锁销毁:pthread_mutex_destroy | pthread_mutex_destory (pthread_mutex_t *mutex)//线程锁是占用系统资源的,如果不再使用,可进行销毁,释放空间 |
Demo
PS:该demo演示采用互斥锁,实现线程同步访问共享资源的场景
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
//临界(共享)资源定义
int global_cake = 10;
//1、创建锁方法一:采用宏定义,实现静态创建线程锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//2、创建锁方法二:调用线程锁初始化函数,动态创建锁
/*
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
*/
//线程函数声明
void *thread1(void *arg);
void *thread2(void *arg);
//主函数
int main(int argc, char*argv[])
{
pthread_t pthread1;//定义线程ID
pthread_t pthread2;
char *exit_status1 = NULL;
char *exit_status2 = NULL;
int arg1 = 8;//定义线程函数参数,可以是整形,字符型等,如有多个参数可定义结构体
int arg2 = 6;
/*******1、线程创建*******/
if(0 != pthread_create(&pthread1, NULL, thread1, (void *)&arg1))
{
perror("create thread1 failed!\n");
}
if(0 != pthread_create(&pthread2, NULL, thread2, (void *)&arg2))
{
perror("create thread2 failed!\n");
}
printf("main thread started!ID:%ld\n", (unsigned long)pthread_self());//获取主线程ID
/*******2、线程等待*******/
//等待线程退出,并收集线程退出信息。如果不等待,主线程提前退出后,其他线程也随之结束
pthread_join(pthread1, (void **)&exit_status1);
pthread_join(pthread2, (void **)&exit_status2);
//打印线程退出信息:
printf("exit_status1:%s\n", exit_status1);
printf("exit_status2:%s\n", exit_status2);
return 0;
}
//线程1
void *thread1(void *arg)
{
char *exit_status = "路人甲:吃饱了\n";
/*******线程加锁*******/
pthread_mutex_lock(&mutex);//加锁,其他申请加锁的线程处于等待状态
printf("thread1 started!ID:%ld\n", (unsigned long)pthread_self());//获取线程1的ID
printf("arg = %d\n", *((int*)arg));//打印线程参数
printf("路人甲:蛋糕到了,我先吃吧!\n");
do
{
printf("还有:%d份\n", global_cake);
if(global_cake == 5)
{
printf("路人甲:嗝~~ 我已经吃饱了,还有%d份蛋糕了,都留给你吧\n", global_cake);
sleep(2);
/*******线程解锁*******/
pthread_mutex_unlock(&mutex);//解锁,一经解锁,其他申请加锁的线程将解除等待,立即执行
/*******线程退出*******/
pthread_exit((void *)exit_status);//线程退出信息可以是整型,字符型,结构体等数据类型
}
sleep(2);
}while(global_cake--);
}
//线程2
void *thread2(void *arg)
{
char *exit_status = "路人乙:吃饱了!\n";
printf("thread2 started!ID:%ld\n", (unsigned long)pthread_self());//获取线程2的ID
printf("arg = %d\n", *((int*)arg));//打印线程参数
/*******线程加锁*******/
pthread_mutex_lock(&mutex);//如果其他线程已经获得锁,则当前线程被阻塞
printf("路人乙:好的,我要全部吃完\n");
do
{
printf("还有:%d份\n", global_cake);
if(global_cake == 0)
{
/*******线程解锁*******/
pthread_mutex_unlock(&mutex);
printf("路人乙:已经吃饱了,还有%d份蛋糕\n", global_cake);
/*******线程退出*******/
pthread_exit((void *)exit_status);
}
sleep(2);
}while(global_cake--);
}