网站运营
位置:首页>> 网站运营>> linux多线程编程(四)

linux多线程编程(四)

作者:hebedich  发布时间:2022-01-18 04:59:49 

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

0
投稿

猜你喜欢

  • 下载 CentOS7我下载的镜像是 CentOS-7-x86_64-DVD-1908.iso ,你也可以自由选择,下面是下载链接。CentO
  • 如何使用Godaddy主机拷贝Account Manager的文件到自己选择的目的地去呢?首先. 登陆你的Account Manager.第
  • 不同的站点对安全级别的要求不同,康盛创想(Comsenz)推出的Discuz!系统允许站点管理者,通过自定义配置文件中的 config.in
  •  国防部网站截图对话嘉宾:国防部网站总编辑 季桂林【核心阅读】国防部新闻事务局设立、新闻发言人亮相…&
  • 在网页运营改版过程中,经常有设计师或者运营同事有这样的疑问:我的页面到底产生了多大价值?这个页面引导的用户接下来访问了多少商品的页面?有没有
  • 1.创建一个站点文件夹 首先你要创建一个独立于你的主站点的新的站点文件夹(若站点是建立在同一个服务器上面的话),这样你下面要做的改动才不会影
  • 从事SEO行业的朋友都知道,网站优化最重要的两方面内容一是网站的友情链接质量和数量,另一个方面就是网站内容的质量,大家都在提倡尽量多的原创文
  • 央视曝光百度竞价排名内幕由于竞价排名让花钱的企业出现在被搜索结果的前列,因此,一些不愿为此花钱的企业只能出现在搜索结果的末尾。来源:央视网1
  • 据说,世界上每年由于垃圾电子邮件给人们带来的损失就高达数亿美元。在Windows操作系统中也许您已经尝够了垃圾邮件给您带来的苦头,让您防不胜
  • 国内知名IT企业金山软件近日宣布,旗下业务增长重心之一金山毒霸将与泰国知名网游运营商Asiasoft合作,正式进军泰国市场,并推出泰文版金山
  • 快播的出现,已经成为互联网在线点播的一种新的标准。在网络视频点播日渐强大的今天,快播以其高清晰的点播资源,流畅的播放速度,赢得了众多影视发烧
  • 大家好,我是幻神,近期百度可以说是做了一次大的调整,几乎大部分的站多遇到站点不更新,首页不在第一页的一些问题,在我们抱怨百度的同时,有没有想
  • 把日志安顿好之后,总结一下从PJBlog 搬家到 WordPress 的经验。首先感谢网友 NEO 陪我折腾,没有他的帮助我的搬家
  • 一个网站的PR似乎是SEO至关重要的一步,很多网站从最初的PR0升到PR5,都用了半年一年甚至更多的时间。所以,新站如何快速的获得高质量的友
  • QQ网站登录处没有使用https进行加密,而是采用了RSA非对称加密来保护传输过程中的密码以及敏感信息的安全性。 QQ是在javascrip
  • FTP命令是Internet用户使用最频繁的命令之一,不论是在DOS还是UNIX操作系统下使用FTP,都会遇到大量的FTP内部命令。熟悉并灵
  • 第一个问题:链接看起来和普通文本一样,是否是属于隐藏链接?几乎所有seo人员的博客上都有大量链接,给出某个链接很可能因为文章中确实涉及到关于
  • 安装篇2003默认安装不带IIS的,要安装,请点击开始->管理工具->配置您的服务器向导然后一步步的下一步。到了列表选择项目的时
  • 相信大家在为网站录入文章的时候都有过这样的经历:明明是一篇已经添加好图片的Word文档,在html编辑器里却只能copy文本而不能贴图,最后
  • 在入门篇,我们学会了SQL注入的判断方法,但真正要拿到网站的保密内容,是远远不够的。接下来,我们就继续学习如何从数据库中获取想要获得的内容,
手机版 网站运营 asp之家 www.aspxhome.com