线程创建
功能:创建一个新的线程,
原型
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