热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程编程之五:线程同步互斥量

###Date:20171113转载自:http:blog.csdn.netlovecodelessarticledetails24885127Pthread是POS
###Date: 2017/11/13

转载自:http://blog.csdn.net/lovecodeless/article/details/24885127

Pthread是 POSIX threads 的简称,是POSIX的线程标准

         Pthread线程同步多个线程协调地,有序地同步使用共享资源。【C/C++多线程编程之五】pthread线程深入理解中讲述到,多线程共享进程资源,一个线程访问共享资源需要一段完整地时间才能完成其读写操作,如果在这段时间内被其他线程打断,就会产生各种不可预知的错误。协调线程按一定的规则,不受打扰地访问共享资源,保证正确性,这便是线程同步的出发点。

       互斥量,是最简单的线程同步机制,也是最常用的同步策略。

       

       1.互斥量(mutex):





       互斥量是一种线程同步对象,“互斥”的含义是同一时刻只能有一个线程获得互斥量。一个互斥量对应一个共享资源,互斥量状态:1.解锁状态意味着共享资源可用,2.加锁状态意味着共享资源不可用

       一个线程需要使用共享资源时,使用thread_mutex_lock申请:1.当互斥量为解锁状态,则占用互斥量,并给互斥量加锁,占用资源(互相量为加锁状态,其他线程不能使用互斥量并等待互斥量变为解锁状态),2.如果互斥量为加锁状态,则线程等待,直到互斥量为解锁状态(其他线程使用完共享资源后会解锁互斥量,释放资源)。




        2.互斥量基本函数:        

        #include
初始化互斥量:
        int pthread_mutex_init(pthread_mutex *mutex,
                                                const pthread_mutexattr_t* mutexattr
);


        该函数第一个参数为一个互斥量指针,第二个参数为互斥量属性指针(一般设为NULL)。该函数将按照互斥量属性对互斥量进行初始化。

互斥量加锁:
        int pthread_mutex_lock(pthread_mutex *mutex);

        该函数申请一个互斥量并对其进行加锁,使该互斥量对其他线程不可用,让其他申请互斥量的线程等待。
互斥量解锁:
        int pthread_mutex_unlock(pthread_mutex *mutex);


        该函数对互斥量进行解锁操作,使该互斥量对其他线程可以。
销毁互斥量:
        int pthread_mutex_destroy(pthread_mutex *mutex);


        该函数销毁一个不再需要的互斥量,释放系统资源。




DEMO:

#include
#include
#include
#include
#pragma comment(lib, "pthreadVC2.lib") //必须加上这句
pthread_t t1; //pthread_t变量t1,用于获取线程1的ID
pthread_t t2; //pthread_t变量t2,用于获取线程2的ID
char Share[10]; //共享资源区
pthread_mutex_t work_mutex; //声明互斥量work_mutex
void* My_thread_1(void* args){while (1){char *p &#61; Share;pthread_mutex_lock(&work_mutex); //加锁for (int i &#61; 0; i <9; i&#43;&#43;){*p &#61; &#39;a&#39;; //线程1将Share写成aaaaaaaaSleep(100);p&#43;&#43;;}p&#43;&#43;;*p &#61; &#39;\0&#39;;printf("1 Share is : %s\n", Share);pthread_mutex_unlock(&work_mutex); //解锁Sleep(100); //启用互斥量时也去除注释&#xff0c;为进程调度提供时间}return NULL;
}
void* My_thread_2(void* args){while (1){char *p &#61; Share;pthread_mutex_lock(&work_mutex); //加锁for (int i &#61; 0; i <9; i&#43;&#43;){*p &#61; &#39;e&#39;; //线程1将Share写成eeeeeeeeSleep(150);p&#43;&#43;;}p&#43;&#43;;*p &#61; &#39;\0&#39;;printf("2 Share is : %s\n", Share);pthread_mutex_unlock(&work_mutex); //解锁Sleep(100); //启用互斥量时也去除注释&#xff0c;为进程调度提供时间}return NULL;
}
int main(){pthread_mutex_init(&work_mutex, NULL); //初始化互斥量pthread_create(&t1, NULL, My_thread_1, NULL);pthread_create(&t2, NULL, My_thread_2, NULL);Sleep(1000000);pthread_mutex_destroy(&work_mutex); //销毁互斥量return 0;
}

分析&#xff1a;


不采用互斥锁的情况下&#xff0c;两个线程对共享资源的访问时随机的&#xff0c;如下图所示&#xff1a;







采用互斥锁的情况下&#xff0c;两个线程对共享资源的访问是同步的&#xff0c;产生字符串aaaaaaaaa或eeeeeeeee&#xff0c;如下图所示&#xff1a;










推荐阅读
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 线程漫谈——线程基础
    本系列意在记录Windwos线程的相关知识点,包括线程基础、线程调度、线程同步、TLS、线程池等。进程与线程理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必 ... [详细]
  • 不知道你是否还记得之前在进程中的信号处理时,提到过阻塞信号集与未决信号集的概念,如果你已经忘记了,请参考《阻塞信号与未决信号》一文回忆一下 ... [详细]
  • pthread_mutex_lockpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_trylock(pthre ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • Linux线程的同步和互斥
    目录1、线程的互斥2、可重入VS线程安全3、线程的同步1、线程的互斥 ... [详细]
  • python之poc编写——sql篇
    文章目录sql注入漏洞漏扫单个网站基础sql扫描多个网站sql基础扫描时间盲注型扫描升阶版sq ... [详细]
  • Threadtowaitinfinitelyinaloopuntilaflagstatechange,thencallfunction.线程在循环中无限期等待,直到标志状 ... [详细]
  • Linux 中使用 clone 函数来创建线程
    2019独角兽企业重金招聘Python工程师标准Linux上创建线程一般使用的是pthread库实际上libc也给我们提供了创建线程的函数那就是cloneintclone(i ... [详细]
  • 作者一直强调的一个概念叫做oneloopperthread,撇开多线程不谈,本篇博文将学习,怎么将传统的IO复用pollepoll封装到C++类中。1.IO复用复习使用p ... [详细]
  • 主线:设计窗口类注册窗口类产生窗口显示窗口更新窗口消息循环(将消息路由到窗口中去处理)。APPMODUL.CPP源文件被编译链接进入项目,从APPMOD ... [详细]
  • C语言编程gcc怎么生成静态库.a和动态库.so
    这篇文章将为大家详细讲解有关C语言编程gcc怎么生成静态库.a和动态库.so,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章 ... [详细]
author-avatar
李国龙度_476
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有