linuxc_螺纹锁紧pthread_mutex_t
在实际执行过程中的线程,我们经常需要同步多线程。
然后你可以使用互斥锁来完成任务;在使用过程中互斥锁,有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock这几个函数以完毕锁的初始化,锁的销毁。上锁和释放锁操作。
一。锁的创建
锁能够被动态或静态创建,能够用宏PTHREAD_MUTEX_INITIALIZER来静态的初始化锁,採用这样的方式比較easy理解,相互排斥锁是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;
- }
#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;
}
将运行一个螺纹螺纹。
版权声明:本文博主原创文章。博客,未经同意不得转载。
linuxc_螺纹锁紧pthread_mutex_t的更多相关文章
- 深入了解java同步、锁紧机构
该薄膜还具有从本文试图一个高度来认识我们共同的同步(synchronized)和锁(lock)机制. 我们假定读者想了解更多的并发知识推荐一本书<java并发编程实战>,这是一个经典的书, ...
- 《深入浅出 Java Concurrency》—锁紧机构(一)Lock与ReentrantLock
转会:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最 ...
- Linux线程-互斥锁pthread_mutex_t
在线程实际运行过程中,我们经常需要多个线程保持同步.这时可以用互斥锁来完成任务:互斥锁的使用过程中,主要有pthread_mutex_init,pthread_mutex_destory,pthrea ...
- Linux同步机制(一) - 线程锁
1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步. 这时可以用互斥锁来完成任务.互斥锁的使用过程中,主要有 pthread_mutex_init pthread_mutex_destor ...
- 锁开销优化以及 CAS 简单说明
锁开销优化以及 CAS 简单说明 锁 互斥锁是用来保护一个临界区,即保护一个访问共用资源的程序片段,而这些共用资源又无法同时被多个线程访问的特性.当有线程进入临界区段时,其他线程或是进程必须等待. 在 ...
- iOS开发之用到的几种锁整理
1. iOS中的互斥锁 在编程中,引入对象互斥锁的概念,来保证共享数据操作的完整性.每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问对象. 1.1 @sync ...
- C++线程中的几种锁
线程之间的锁有:互斥锁.条件锁.自旋锁.读写锁.递归锁.一般而言,锁的功能越强大,性能就会越低. 1.互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量.也就是说是为了避免多个线程在 ...
- C 语言多线程与锁机制
C 语言多线程与锁机制 多线程 #include <pthread.h> void *TrainModelThread(void *id) { ... pthread_exit(NULL) ...
- Linux 互斥锁
互斥的概念 在多线程编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性. 每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻, 只能有一个线程访问该 ...
随机推荐
- BytesWritable 存储问题
public static void main(String args[]){ BytesWritable cv = new BytesWritable(); String str1 = " ...
- SVN模型仓库中的资源从一个地方移动到另一个地方的办法(很久才解决)
弄了很久,想使用domove这个操作,但是都失败了.最后给svnkit的邮箱写了封邮件,他们告诉我这样做就成功了.实际上是使用docopy这个函数实现了move操作.package com.repos ...
- SWT的GridData一些参数的图示
1. 参数:verticalSpan GridData gridData=new GridData(); gridData.verticalSpan=100; final Text nameText= ...
- ecshop 后台添加 成本价 利润
ecshop后台admin中的商品操作php文件,goods.php替换为下面的代码, 还要在数据库商品本店售价后门添加 cost 字段 为 商品成本价 ecs_goods表中添加 cost ...
- A Game of Thrones(0) - PROLOGUE
"We should start back", Gared urged as the woods began to grow dark around them. "The ...
- HDU2586 How far away ?(LCA模板题)
题目链接:传送门 题意: 给定一棵树,求两个点之间的距离. 分析: LCA 的模板题目 ans = dis[u]+dis[v] - 2*dis[lca(u,v)]; 在线算法:详细解说 传送门 代码例 ...
- Spring in action(Spring实战) 第四版中文翻译
第一部分 Spring核心 Spring提供了非常多功能,可是全部这些功能的基础是是依赖注入(DI)和面向方面编程(AOP). 第一章 Springing into action 本章包含: Spri ...
- SharedPreferences共享优先存储的详细解析和原理
共享优先存储: publicvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont ...
- hdu3452 无向树去掉最小的边集使不论什么叶子与根不连通 / 最小割
思路一下就上来了,叶子向汇点连边,inf保证不会成为割,跑根到汇点最小割就可以.注意无向树双向建边.基础题,分分钟1A: #include<iostream> #include<qu ...
- Oracle改变字段类型
由于需求变化.现在,我们要一个类型NUMBER(8,2)字段类型改变 char. 总体思路如以下: 将要更改类型的字段名改名以备份,然后加入一个与要更改类型的字段名同名的字段(原字段已经改 ...