千家信息网

多线程与互斥锁的实例分析

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,多线程与互斥锁的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。线程:线程是程序中的一个执行流,每个线程都有自己的
千家信息网最后更新 2026年11月02日多线程与互斥锁的实例分析

多线程与互斥锁的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

线程:线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

多线程:多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

线程创建

函数原型:int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict attr,void *(*start_rtn)(void),void *restrict arg);

返回值:若是成功建立线程返回0,否则返回错误的编号。

形式参数:pthread_t *restrict tidp要创建的线程的线程id指针;const pthread_attr_t *restrict attr创建线程时的线程属性;void *(start_rtn)(void)返回值是void类型的指针函数;void *restrict arg start_rtn的形参。

线程挂起:该函数的作用使得当前线程挂起,等待另一个线程返回才继续执行。也就是说当程序运行到这个地方时,程序会先停止,然后等线程id为thread的这个线程返回,然后程序才会断续执行。

函数原型:int pthread_join(pthread_tthread, void **value_ptr);

参数说明如下:thread等待退出线程的线程号;value_ptr退出线程的返回值。

返回值:若成功,则返回0;若失败,则返回错误号。

线程退出

函数原型:void pthread_exit(void *rval_ptr);

获取当前线程id

函数原型:pthread_t pthread_self(void);

互斥锁

创建pthread_mutex_init;销毁pthread_mutex_destroy;加锁pthread_mutex_lock;解锁pthread_mutex_unlock。

互斥量从本质上说就是一把锁, 提供对共享资源的保护访问。

 1. 初始化:

   在Linux下, 线程的互斥量数据类型是pthread_mutex_t. 在使用前, 要对它进行初始化:

  对于静态分配的互斥量, 可以把它设置为PTHREAD_MUTEX_INITIALIZER, 或者调用pthread_mutex_init.

  对于动态分配的互斥量, 在申请内存(malloc)之后, 通过pthread_mutex_init进行初始化, 并且在释放内存(free)前需要调用pthread_mutex_destroy.

  原型:

  int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restric attr);

  int pthread_mutex_destroy(pthread_mutex_t *mutex);

  头文件:

   返回值: 成功则返回0, 出错则返回错误编号.

  说明: 如果使用默认的属性初始化互斥量, 只需把attr设为NULL. 其他值在以后讲解。

  2. 互斥操作:

   对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁. 在完成了对共享资源的访问后, 要对互斥量进行解锁。

  首先说一下加锁函数:

  头文件:

  原型:

  int pthread_mutex_lock(pthread_mutex_t *mutex);

  int pthread_mutex_trylock(pthread_mutex_t *mutex);

  返回值: 成功则返回0, 出错则返回错误编号.

   说明: 具体说一下trylock函数, 这个函数是非阻塞调用模式, 也就是说, 如果互斥量没被锁住, trylock函数将把互斥量加锁, 并获得对共享资源的访问权限; 如果互斥量被锁住了, trylock函数将不会阻塞等待而直接返回EBUSY, 表示共享资源处于忙状态。

  再说一下解所函数:

  头文件:

  原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);

  返回值: 成功则返回0, 出错则返回错误编号.

  3. 死锁:

   死锁主要发生在有多个依赖锁存在时, 会在一个线程试图以与另一个线程相反顺序锁住互斥量时发生. 如何避免死锁是使用互斥量应该格外注意的东西。

  总体来讲, 有几个不成文的基本原则:

  对共享资源操作前一定要获得锁。

  完成操作以后一定要释放锁。

  尽量短时间地占用锁。

  如果有多锁, 如获得顺序是ABC连环扣, 释放顺序也应该是ABC。

  线程错误返回时应该释放它所获得的锁。

条件锁

创建pthread_cond_init;销毁pthread_cond_destroy;触发pthread_cond_signal;广播pthread_cond_broadcast;等待pthread_cond_wait。以后补充

下面以一个demo程序了解一下,

#include#include#include#include#includevoid * print_a(void *);void * print_b(void *);static pthread_mutex_t testlock;int main(void){  pthread_t t0;  pthread_t t1;  pthread_mutex_init(&testlock,NULL);    //create thread a  if(pthread_create(&t0,NULL,print_a,NULL)){    puts("fail to create pthread a");    exit(1);  }  //create thread b  if(pthread_create(&t1,NULL,print_b,NULL)){    puts("fail to create pthread b");    exit(1);  }  void *result;  if(pthread_join(t0,&result)==-1){    puts("fail to reconnect to");    exit(1);  }  if(pthread_join(t1,&result)==-1){    puts("fail to reconnect t1");    exit(1);  }  pthread_mutex_destroy(&testlock);  return 0;}void * print_a(void *a){  int i=0;  pthread_mutex_lock(&testlock);  for(i=0;i<10;i++){    sleep(1);    puts("aa");    if(i==4){      pthread_mutex_unlock(&testlock);      sleep(1);      pthread_mutex_lock(&testlock);    }  }  pthread_mutex_unlock(&testlock);  return NULL;}void * print_b(void *b){  int i=0;  pthread_mutex_lock(&testlock);  for(i=0;i<20;i++){    sleep(1);    puts("bb");    if(i==6){      pthread_mutex_unlock(&testlock);      sleep(1);      pthread_mutex_lock(&testlock);    }  }  pthread_mutex_unlock(&testlock);  return NULL;}

运行结果如下:

aaaaaaaaaabbbbbbbbbbbbbbaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbb

我们创建了两个进程t0和t1,以及互斥锁testlock。当两个线程同时运行的时候,线程t0上锁以后,线程t1等待线程t0释放锁,线程t1加锁以后线程t0,等待,所以出现了如上的运行结果。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

线程 函数 程序 原型 共享资源 资源 错误 成功 运行 多个 不同 也就是 也就是说 指针 文件 顺序 死锁 阻塞 两个 任务 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技图片 互联网科技垄断 没上市的科技互联网公司 互联网金融 科技 宜安科技 互联网金融 奔汉互联网科技 苏州大垚互联网科技 海南购全球互联网科技 互联网科技公司招聘 开启互联网科技时代小说 玖二柒互联网科技公司待遇 厦门比较好的科技互联网公司 江阴互联网智能科技产品进口 互联网科技与大数据专业 洛阳昕诺飞互联网科技有限公司 银川新华互联网科技学校联系电话 科技大学互联网 深圳无忧互联网科技 本届互联网大会上的黑科技 互联网科技职业技能培训学校 互联网科技工作委员会副主任毛军 互联网巨头科技公司 须眉科技是互联网公司吗 全球顶尖互联网科技公司 苏州五指互联网络科技有限 崇明区互联网教育科技售后服务 厦门江牛科技互联网 国产互联网科技公司 西安左小互联网科技有限公司 如何强化互联网金融科技
0