linux thread mutex
来源:互联网 发布:淘宝交易订单生成器 编辑:程序博客网 时间:2024/05/18 05:09
为保持thread同步,需要使用mutex。主要的API 如下
pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock
1. 创建锁。
互斥锁是pthread_mutex_t的结构体
锁的创建分为静态和动态,静态使用如下的宏
PTHREAD_MUTEX_INITIALIZER
动态使用如下函数
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)
2. 锁的属性
互斥锁属性可以由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;}
- linux thread mutex example
- linux thread mutex
- thread-mutex
- ACE中的Thread Mutex在linux下的使用
- ACE中的Thread Mutex在linux下的使用
- C# Thread 同步 Mutex
- boost::thread mutex
- linux Mutex
- Mutex Linux
- Boost Thread 临界区 mutex
- Boost Thread中mutex 用法
- Boost Thread中mutex 用法
- std::thread and std::mutex
- std::thread and std::mutex
- VB.NET中的线程操作(Thread,Mutex)
- VB.NET中的线程操作(Thread,Mutex)
- [windows][thread] 同步.内核.Mutex.Semaphores等
- [Thread] 執行緒同步資源鎖定 – Mutex
- [Client]动检参数讨论与ONVIF
- Reverse Words in a String
- Iterator与ListIterator有什么区别?
- 百度地图定位getAddrStr() 获取为空
- Spring3.x--自动装配Bean属性
- linux thread mutex
- Java4Android之socket网络通信基础
- Linux环境变量配置文件
- Linux proc机制
- PHP入门的感受
- mac 下安装jmeter
- is a j-link clone
- [ACM] hdu 4403 A very hard Aoshu problem (DFS暴搜数字)
- 【周报】第八周(8月24日~8月30日)工作总结报告——遇到的问题篇