linux多线程编程(四)

 更新时间:2014年08月27日 10:29:28   投稿:hebedich  
linux中的线程是轻量级的线程,linux中的线程调度是由内核调度程序完成的,每个线程有自己的ID号。与进程相比,它们消耗的系统资源少、创建较快、相互间的通信也较容易。

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)是一个著名的同步问题。

相关文章

  • apache 配置成滚动日志的方法

    apache 配置成滚动日志的方法

    apache默认的日志只是1个文件,随着访问量的加大,该日志文件会越来越大,借助apache的rotatelogs.exe自动生成滚动日志。
    2010-12-12
  • Linux(ubuntu)下实现增加/删除文件权限

    Linux(ubuntu)下实现增加/删除文件权限

    下面小编就为大家分享一篇Linux(ubuntu)下实现增加/删除文件权限,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Linux移动文件夹(目录)以及目录下的内容问题

    Linux移动文件夹(目录)以及目录下的内容问题

    这篇文章主要介绍了Linux移动文件夹(目录)以及目录下的内容问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • apache配置php实现单一入口方法

    apache配置php实现单一入口方法

    这篇文章主要介绍了apache配置php实现单一入口方法,大家参考使用
    2013-12-12
  • Linux NFS机制工作原理及实例解析

    Linux NFS机制工作原理及实例解析

    这篇文章主要介绍了Linux NFS机制工作原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 5个提高Linux开发效率的工具

    5个提高Linux开发效率的工具

    这篇文章主要介绍了5个提高Linux开发效率的工具,能够充分个性化并无缝地融入独特工作流程的工具才是真正的好工具。想要知道哪五个Linux工具可以提高开发效率,请阅读本文
    2015-12-12
  • Linux之删除带有空格的文件(不是目录)

    Linux之删除带有空格的文件(不是目录)

    这篇文章主要介绍了Linux之删除带有空格的文件(不是目录),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Keepass+PuTTYPortable+Winscp一键登录实例详解

    Keepass+PuTTYPortable+Winscp一键登录实例详解

    这篇文章主要介绍了Keepass+PuTTYPortable+Winscp一键登录实例详解的相关资料,需要的朋友可以参考下
    2017-01-01
  • linux如何将某个文件夹移动到另一个文件夹下

    linux如何将某个文件夹移动到另一个文件夹下

    这篇文章主要介绍了linux如何将某个文件夹移动到另一个文件夹下问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • 在Linux系统中查看所有正在运行服务的方法小结

    在Linux系统中查看所有正在运行服务的方法小结

    在 Linux 系统中所有正在运行的服务都是用什么查看的?其实使用系统自带的工具和很多方法都可以查看到系统所有正在运行的服务,本文就和大家探讨这个问题,感兴趣的小伙伴跟着小编一起来看看吧
    2024-07-07

最新评论