linux 多线程学习一:互斥
来源:互联网 发布:淘宝手链店 编辑:程序博客网 时间:2024/06/06 03:46
#include<iostream>#include<pthread.h>using namespace std;pthread_t pt[2];pthread_mutex_t mtx;int num = 100;void *func_thread(void* input){ while(1) { pthread_mutex_lock(&mtx); if(num <= 0 || num >= 200) pthread_exit(0); cout<<"this is thread:"<<(char*)input <<endl; if(0 == strcmp((char*)input,"thread1")) { num++; } else { num--; } cout<<"now num="<<num<<endl; pthread_mutex_unlock(&mtx); sleep(1); }}int main(){ pthread_create(&pt[0],NULL,func_thread,(void*)"thread1"); pthread_create(&pt[1],NULL,func_thread,(void*)"thread2"); pthread_join(pt[0],NULL); pthread_join(pt[1],NULL); return 0;}
加入sleep的目的是防止资源一直被“thread1”占用
编译的时候要包含pthread库:
g++ thread_test.cpp -lpthread -o a.out
关于互斥锁我们主要可以用到下面3个函数(引自百度百科):
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而不是挂起等待。
另外互斥锁还有动态和静态创建的区别,我这里采用的是静态创建,动态创建需要用到:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
int pthread_mutex_destroy(pthread_mutex_t *mutex)
其中pthread_mutexattr_t表示的是互斥锁的属性(引自百度百科):
互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。
当前(glibc2.2.3,linuxthreads0.9)有四个值可供选择:
* PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源
分配的公平性。
* PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
* PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会
出现最简单情况下的死锁。
* PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
- linux 多线程学习一:互斥
- java多线程学习(一)---线程互斥
- windows&linux多线程互斥
- linux多线程学习一
- 【Linux】 多线程编程(互斥锁实现互斥)
- linux 多线程编程 同步与互斥
- linux多线程的互斥与同步
- linux多线程编程 同步与互斥
- linux c++ 多线程 互斥访问
- Linux C 多线程【4】--线程互斥
- Linux多线程编程--同步与互斥
- Linux多线程编程--同步与互斥
- Linux多线程的同步与互斥
- Linux多线程的同步与互斥
- Linux 多线程同步与互斥
- linux多线程-操作系统线程同步互斥
- Linux的多线程--同步与互斥
- Linux多线程编程--同步与互斥
- 我爱学Java之JVM中的OopMap
- 数据库理论-设计范式
- java_singlton模式
- SQLiteDatabase
- 四个人脸数据集,matlab格式 Four face databases in matlab format
- linux 多线程学习一:互斥
- leetcode_24. Swap Nodes in Pairs C++
- bzoj1149/2895 [JSOI2009]球队收益
- 二维码扫描,生成
- 剑指offer05--用两个栈来模拟队列
- 特征学习的matlab代码和数据集 Matlab Codes and Datasets for Feature Learning
- URL路径中传参
- HDOJ/HDU 2561 第二小整数(水题~排序~)
- JAVA枚举使用详解