科技常识:linux多线程编程(四)

2021-03-15 12:36:30
导读 今天小编跟大家讲解下有关linux多线程编程(四) ,相信小伙伴们对这个话题应该也很关注吧,小编也收集到了有关linux多线程编程(四) 的

今天小编跟大家讲解下有关linux多线程编程(四) ,相信小伙伴们对这个话题应该也很关注吧,小编也收集到了有关linux多线程编程(四) 的相关资料,希望小伙伴会喜欢也能够帮助大家。

linux线程分为两类:一是核心级支持线程,二是用户级的线程。一般都为用户级的线程。

一、多线程的几个常见函数

要创建多线程必须加载pthread.h文件,库文件pthread。线程的标识符pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:typedef unsigned long int pthread_t

1.创建线程:

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);参数: thread输出线程id attr 线程属性, 默认NULL start_routine线程执行函数 arg线程执行参数 note:函数成功返回0 否则返回错误码

2.等待指定线程结束:

int pthread_join(pthread_t thread,void **value_ptr);参数: thread一个有效的线程id value_ptr 接收线程返回值的指针note:调用此函数的线程在指定的线程退出前将处于挂起状态或出现错误而直接返回,如果value_ptr非NULL则value_ptr指向线程返回值的指针,函数成功后指定的线程使用的资源将被释放。

3.退出线程:

int pthread_exit(void * value_ptr);参数: value_ptr 线程返回值指针note: ptrhead_exit()退出调用此函数的线程并释放该线程占用的资源。

4.获取当前线程id:

pthread_t pthread_self(void);参数: note:返回当前函数的id

5.互斥

创建互斥:int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);参数: mutex输出互斥id attr 互斥属性, 默认NULLnote:函数成功返回0 否则返回错误码锁住互斥:int pthread_mutex_lock(pthread_mutex_t *mutex);参数: mutex互斥idnote:如果指定的互斥id已经被锁住那么呼叫线程在互斥id完全解锁前将一直处于挂起状态,否则将锁住互斥体。int pthread_mutex_trylock(pthread_mutex_t *mutex);参数: mutex互斥idnote:如果指定的互斥id已经被锁住那么将直接返回一个错误,通过判断此错误来进行不同的处理。pthread_mutex_trylock和pthread_mutex_lock相似,不同的是pthread_mutex_trylock只有在互斥被锁住的情况下才阻塞。解锁互斥:int pthread_mutex_unlock(pthread_mutex_t *mutex);参数: mutex互斥idnote:如果指定的互斥id已经被锁住那么对其解锁释放互斥:int pthread_mutex_destroy(pthread_mutex_t *mutex);参数: mutex互斥idnote:释放指定的mutex占用的资源。函数pthread_mutex_init和pthread_mutex_destroy分别是互斥锁的构造函数和析构函数。

二、多线程同步

1.互斥体

互斥量(mutex)相当于一把锁,可以保证以下三点:◎原子性:如果一个线程锁定一个互斥量,那么临界区内的操作要么全部完成,要么一个也不执行。◎惟一性:如果一个线程锁定一个互斥量,那么在它解除锁定之前,没有其他线程可以锁定这个互斥量。◎非繁忙等待:如果一个线程已经锁定一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何CPU资源),直到第一个线程解除对这个互斥量的锁定为止。

2.条件变量

条件变量是一种可以使线程(不消耗CPU)等待某些事件发生的机制。某些线程可能守候着一个条件变量,直到某个其他的线程给这个条件变量发送一个信号,这时这些线程中的一个线程就会苏醒,处理这个事件。但条件变量不提供锁定,所以它必须与一个互斥量同时使用,提供访问这个环境变量时必要的锁定。3.信号量Dijkstra提出了信号量的概念,信号量是一种特殊的变量,只可以取正整数值,对这个正整数只能采取两种操作:P操作(代表等待,关操作)和V操作(代表信号,开操作)。P/V操作定义如下(假设我们有一个信号量sem) :P(sem):如果sem的值大于0,则sem减1;如果sem的值为0,则挂起该线程。V(sem):如果有其它进程因等待sem而挂起,则让它恢复执行;如果没有线程等待sem而被挂起,则sem加上1。信号集的创建与打开int semget(key_t key,int nsems,int flag);对信号量的操作int semop(int semid,struct sembuf semoparray[],size_t nops);对信号量的控制int semctl(int semid,int semnum int cmd,union semun arg);附:经典的生产者-消费者问题(Producer-Costomer)是一个著名的同步问题。

来源:爱蒂网

免责声明:本文由用户上传,如有侵权请联系删除!

猜你喜欢

最新文章