pthread多线程编程详细解析----条件变量 pthread_mutex_t

news/2024/5/19 5:05:11 标签: pthread, mutex


一,锁的创建pthread_mutex_init
二,锁的属性pthread_mutexattr_init
三,锁的释放pthread_mutex_destory
四,锁操作pthread_mutex_lock/pthread_mutex_unlock/pthread_mutex_trylock
五,锁的使用

关于pthread_cond_t的使用方法,请阅读《pthread多线程编程详细解析----条件变量 pthread_cond_t

关于cond和mutex需要配合使用的原理,请阅读《pthreads 里mutex和cond为何需要配合使用

     在线程实际运行过程中,我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务;互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。


一,锁的创建

    锁可以被动态或静态创建,可以用宏PTHREAD_MUTEX_INITIALIZER来静态的初始化锁,采用这种方式比较容易理解,互斥锁是pthread_mutex_t的结构体,而这个宏是一个结构常量,如下可以完成静态的初始化锁:

    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

    另外锁可以用pthread_mutex_init函数动态的创建,函数原型如下:

    int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)

二,锁的属性

    互斥锁属性可以由pthread_mutexattr_init(pthread_mutexattr_t *mattr);来初始化,然后可以调用其他的属性设置方法来设置其属性;

    互斥锁的范围:可以指定是该进程与其他进程的同步还是同一进程内不同的线程之间的同步。可以设置为PTHREAD_PROCESS_SHARE和PTHREAD_PROCESS_PRIVATE。默认是后者,表示进程内使用锁。可以使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)

pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)

用来设置与获取锁的范围;

    互斥锁的类型:有以下几个取值空间:

  PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。

  PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。

  PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。

  PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。

可以用
pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)

获取或设置锁的类型。

三,锁的释放

    调用pthread_mutex_destory之后,可以释放锁占用的资源,但这有一个前提上锁当前是没有被锁的状态。

四,锁操作

    对锁的操作主要包括加锁 pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁 pthread_mutex_trylock()三个。

  int pthread_mutex_lock(pthread_mutex_t *mutex)

  int pthread_mutex_unlock(pthread_mutex_t *mutex)

  int pthread_mutex_trylock(pthread_mutex_t *mutex)

  pthread_mutex_trylock()语义与pthread_mutex_lock()类似,不同的是在锁已经被占据时返回EBUSY而不是挂起等待

五,锁的使用

#include <pthread.h>  
#include <stdio.h>  
  
pthread_mutex_t mutex ;  
void *print_msg(void *arg){  
        int i=0;  
        pthread_mutex_lock(&mutex);  
        for(i=0;i<15;i++){  
                printf("output : %d\n",i);  
                usleep(100);  
        }  
        pthread_mutex_unlock(&mutex);  
}  
int main(int argc,char** argv){  
        pthread_t id1;  
        pthread_t id2;  
        pthread_mutex_init(&mutex,NULL);  
        pthread_create(&id1,NULL,print_msg,NULL);  
        pthread_create(&id2,NULL,print_msg,NULL);  
        pthread_join(id1,NULL);  
        pthread_join(id2,NULL);  
        pthread_mutex_destroy(&mutex);  
        return 1;  
}  



http://www.niftyadmin.cn/n/1648169.html

相关文章

关于远程调试

1.为什么要用远程调试&#xff1f; 1.本地环境与远程环境为不一致&#xff0c;线上线下数据的不一致&#xff0c;导致有些问题没办法在本地复现。仅靠本地调试无法直接定位问题。 2.本地调试一般有三种方法&#xff0c;一是写测试用例&#xff0c;二是在swagger上测试&#xff…

三十.数据库服务概述 构建MySQL服务器 、 数据库基本管理 MySQL数据类型

mysql50:192.168.4.501.构建MySQL服务器安装MySQL-server、MySQl-client软件包修改数据库用户root的密码确认MySQL服务程序运行、root可控1.1 卸载残留]# systemctl stop mariadb]# rm -rf /etc/my.cnf]# rm -rf /var/lib/mysql/*]# rpm -e --nodeps mariadb-server mariadb 1.…

word或wps中如何把visio或公式等转换为图片

选中想要转换的东西&#xff0c;按CtrlShiftF9 即可快速装换为1比1的清晰图片&#xff0c;相当方便。

win7下创建名为aux.c的文件提示“指定的设备名无效”

今天在下载代码时遇到如下问题&#xff0c; 起初以为是TortoiseSvn的问题&#xff0c;折腾了一个小时&#xff0c;无果。后来索性自己直接创建这个文件&#xff0c;发现无法创建&#xff0c;提示“指定的设备名无效”。这次找到真凶&#xff01;&#xff01;&#xff01;原来如…

对最近的面试遇到问题的查漏补缺

1.函数一直递归会有什么影响&#xff1f;如何优化&#xff1a; 答&#xff1a;会造成栈溢出&#xff0c;需要注意的是即使递归函数不传参也会导致栈的溢出。 原理&#xff1a;因为函数递归时&#xff0c;栈里保存了上一次递归的函数的状态&#xff0c;不仅仅是参数或者局部变量…

Netty Decoder:ByteToMessageDecoder

1. ByteToMessageDecoder 这个类是解码器的基类&#xff0c;其中描述了解码器基本的工作方式和实现原理&#xff1b;&#xff1b;还定义了一个解码的抽象方法decode&#xff0c;这个方法由业务实现&#xff0c;负责将一段字节数据解码为具体的消息对象。 // 存储接收到的数据By…

USB、UART、SPI等总线速率

1. USB总线 USB1.1&#xff1a; ——-低速模式(low speed)&#xff1a;1.5Mbps ——-全速模式(full speed)&#xff1a; 12Mbps USB2.0&#xff1a;向下兼容。增加了高速模式&#xff0c;最大速率480Mbps。 ——-高速模式(high speed)&#xff1a; 25~480Mbps USB3.0&#xff1…