linux多线程编程的知识点有哪些

74次阅读
没有评论

共计 2413 个字符,预计需要花费 7 分钟才能阅读完成。

这篇文章主要介绍“linux 多线程编程的知识点有哪些”的相关知识,丸趣 TV 小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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 互斥属性,默认 null
note: 函数成功返回 0 否则返回错误码
锁住互斥:
int pthread_mutex_lock(pthread_mutex_t *mutex);
参数:
  mutex 互斥 id
note: 如果指定的互斥 id 已经被锁住那么呼叫线程在互斥 id 完全解锁前将一直处于挂起状态, 否则将锁住互斥体。
int pthread_mutex_trylock(pthread_mutex_t *mutex);
参数:
  mutex 互斥 id
note: 如果指定的互斥 id 已经被锁住那么将直接返回一个错误,通过判断此错误来进行不同的处理。pthread_mutex_trylock 和 pthread_mutex_lock 相似,不同的是 pthread_mutex_trylock 只有在互斥被锁住的情况下才阻塞。
解锁互斥:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
参数:
  mutex 互斥 id
note: 如果指定的互斥 id 已经被锁住那么对其解锁
释放互斥:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
参数:
  mutex 互斥 id
note: 释放指定的 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)是一个著名的同步问题。

关于“linux 多线程编程的知识点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注丸趣 TV 行业资讯频道,丸趣 TV 小编每天都会为大家更新不同的知识点。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-14发表,共计2413字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)