关于线程库的一些库函数

本文详细介绍了C/C++中线程库的基本操作,包括线程的创建、退出、等待,以及互斥量和信号量的初始化、销毁、加锁、解锁等关键函数。通过实例演示了生产者消费者模型的使用。
摘要由CSDN通过智能技术生成

线程创建

功能:创建一个新的线程,
在这里插入图片描述
原型
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *
(start_routine)(void), void *arg);
参数详解:
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是个函数地址,线程启动后要执行的函数
arg:传给线程启动函数的参数
返回值:成功返回0;失败返回错误码
代码示例

#include <iostream>
#include <pthread.h>
using namespace std;
void add(void* A);  //处理方法
int main()
{
    pthread_t A;  //线程A
    int B;   //输出线参数
    pthread_create(&A,nullptr,add,&B);

    return 0;
}

线程退出

功能:退出一个线程,而不会影响其他线程
在这里插入图片描述
原型
void pthread_exit(void *value_ptr);
参数
value_ptr:value_ptr不要指向一个局部变量。
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)

线程等待

功能:等待线程结束
在这里插入图片描述
原型
**int pthread_join(pthread_t thread, void value_ptr);
参数

thread:线程ID
value_ptr:它指向一个指针,后者指向线程的返回值
**返回值:**成功返回0;失败返回错误码
代码示例:

#include <iostream>
#include <pthread.h>
using namespace std;
void add(void* A);  //处理方法
int main()
{
    pthread_t A;  //线程A
    int B;   //输出线参数
    pthread_create(&A,nullptr,add,&B);

    pthread_join(A,nullptr);
    return 0;
}

互斥类有关库函数

初始化互斥量

方法1.静态分配

 thread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER

方法 2.动态分配
函数
在这里插入图片描述

原型:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict
attr);
参数:
mutex:要初始化的互斥量
attr:NULL

销毁互斥量

函数:
在这里插入图片描述

模型::int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数 : mutex的指针

加锁和解锁

函数
在这里插入图片描述
加锁函数模型:int pthread_mutex_lock(pthread_mutex_t *mutex); 申请锁不成功进程会挂起阻塞
解锁函数模型:int pthread_mutex_unlock(pthread_mutex_t *mutex);
注:在临界区开始的时候加锁lock,在出去临界区的时候解锁unlock,这算对一段临界资源起到了保护作用

//售票的经典案例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
int ticket = 100;
pthread_mutex_t mutex;
void *route(void *arg)
{
	char *id = (char*)arg;
	while ( 1 ) {
	pthread_mutex_lock(&mutex);
	if ( ticket > 0 ) {
	usleep(1000);
	printf("%s sells ticket:%d\n", id, ticket);
	ticket--;
	pthread_mutex_unlock(&mutex);
	// sched_yield(); 放弃CPU
	} 
	else {
	pthread_mutex_unlock(&mutex);
	break;
	}
	}
}
int main( void )
{
	pthread_t t1, t2, t3, t4;
	pthread_mutex_init(&mutex, NULL);
	pthread_create(&t1, NULL, route, "thread 1");
	pthread_create(&t2, NULL, route, "thread 2");
	pthread_create(&t3, NULL, route, "thread 3");
	pthread_create(&t4, NULL, route, "thread 4");
	pthread_join(t1, NULL);
	pthread_join(t2, NULL);
	pthread_join(t3, NULL);
	pthread_join(t4, NULL);
	pthread_mutex_destroy(&mutex);
}

信号量有关库函数

初始化信号量

函数:
在这里插入图片描述
模型:
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数
pshared:0表示线程间共享,非零表示进程间共享
value:信号量初始值

销毁信号量

在这里插入图片描述
模型:int sem_destroy(sem_t *sem);

等待信号量(P)

函数:
在这里插入图片描述
功能:等待信号量,会将信号量的值减1
模型:int sem_wait(sem_t *sem);//P()

发布信号量 (V)

函数:
在这里插入图片描述
功能:发布信号量,表示资源使用完毕,可以归还资源了。将信号量值加1
模型:int sem_post(sem_t *sem);//V()

关于锁和信号量的实战模型是生产者消费者模型。我已经写好,有需要可以自取(需要在linux环境下运行)
终端命令 : git clone https://gitee.com/ancouly/ProductionConsumerMmodel.git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值