同步——互斥锁
来源:互联网 发布:阿里云客服每月多少钱 编辑:程序博客网 时间:2024/05/16 19:26
互斥锁是最基本的同步形式,用于保护临界区
#include <pthread.h>int pthread_mutex_lock(pthread_mutex_t *mptr);int pthread_mutex_trylock(pthread_mutex_t *mptr);int pthread_mutex_unlock(pthread_mutex_t *mptr);// return : 0/errno
// 互斥锁静态初始化pthread_mutex_t mMutex = PTHREAD_MUTEX_INITIALIZER// 动态初始化pthread_mutex_t *mptr = malloc(sizeof(pthread_mutex_t));pthread_mutex_init(mptr, 0);
// 通常情况下,我们将互斥锁和需要保护的对象封装一个结构体内struct { pthread_mutex_t mutex; int shObj;} shared = { PTHREAD_MUTEX_INITIALIZER};
// 线程间共享互斥锁的生产者消费者#include"unpipc.h"#defineMAXNITEMS 1000000#defineMAXNTHREADS100intnitems;/* read-only by producer and consumer */struct { pthread_mutex_tmutex; intbuff[MAXNITEMS]; intnput; intnval;} shared = { PTHREAD_MUTEX_INITIALIZER };void*produce(void *), *consume(void *);intmain(int argc, char **argv){inti, nthreads, count[MAXNTHREADS];pthread_ttid_produce[MAXNTHREADS], tid_consume;if (argc != 3)err_quit("usage: prodcons2 <#items> <#threads>");nitems = min(atoi(argv[1]), MAXNITEMS);nthreads = min(atoi(argv[2]), MAXNTHREADS);Set_concurrency(nthreads);/* 4start all the producer threads */for (i = 0; i < nthreads; i++) {count[i] = 0;Pthread_create(&tid_produce[i], NULL, produce, &count[i]);}/* 4wait for all the producer threads */for (i = 0; i < nthreads; i++) {Pthread_join(tid_produce[i], NULL);printf("count[%d] = %d\n", i, count[i]);}/* 4start, then wait for the consumer thread */Pthread_create(&tid_consume, NULL, consume, NULL);Pthread_join(tid_consume, NULL);exit(0);}/* end main */void *produce(void *arg){for ( ; ; ) {Pthread_mutex_lock(&shared.mutex);if (shared.nput >= nitems) {Pthread_mutex_unlock(&shared.mutex);return(NULL);/* array is full, we're done */}shared.buff[shared.nput] = shared.nval;shared.nput++;shared.nval++;Pthread_mutex_unlock(&shared.mutex);*((int *) arg) += 1;}}void *consume(void *arg){inti;for (i = 0; i < nitems; i++) {if (shared.buff[i] != i)printf("buff[%d] = %d\n", i, shared.buff[i]);}return(NULL);}
互斥锁可以用在进程间共享:互斥锁建在共享内存区,并设置PTHREAD_PROCESS_SHARED属性,这样该互斥锁为系统级别
pthread_mutex_t *mptr //point to the mutex in shmpthread_mutexattr_t mattr;mptr = /* mutex in shm */Pthread_mutexattr_init(&mattr);Pthread_mutexattr_setpshared(&mattr, PTHEAD_PROCESS_SHARED);Pthread_mutex_init(mptr, &mattr);当在进程间共享一个互斥锁时,持有该互斥锁的进程在持有期间终止,没有办法让系统在进程终止时自动释放所持有的锁,读写锁和Posix信号量亦然;进程终止时内核总是自动清理的唯一同步锁类型是fcntl记录锁。线程在获取锁的情况下被另一个线程Pthread_cancel掉时,我们可以设置清理处理程序pthread_cleanup_pop/push应对该状况。
- 同步——互斥锁
- 线程同步—互斥锁
- 线程同步——互斥锁
- 多线程同步——互斥锁
- sqlserver同步机制——触发器同步
- sqlserver同步机制——触发器同步
- Linux多线程同步——互斥锁
- 线程同步—互斥锁+条件变量
- Java——同步
- 同步线程—Mutex
- 游戏网络同步——MMO位置同步
- 线程同步——用户模式下的线程同步
- java多线程——同步方法和同步代码块
- 内核同步机制——RCU同步机制
- No.7_3 OpenCL 同步——事件同步
- No.7_4 OpenCL 同步——工作项同步
- 游戏网络同步——MMO位置同步
- UE4网络同步详解(一)——理解同步规则
- 用电脑修改时间的时钟(LCD1602显示)--单片机考试
- Intel历届CEO汇总!
- 一个32位整数任意两个比特位交换的宏定义写法
- 通过包名打开apk
- 类的三大特点:封装,继承,多态
- 同步——互斥锁
- v4l2 预备知识
- Android开发书籍推荐
- 关于rg.postgresql.util.PSQLException: ERROR: zero-length delimited identifier at or near """"的解决办法
- iOS Plist设置支持文件共享
- 关于cascade与inverse
- 使用Cookie和JSON记录用户最近浏览历史
- VC++用异或(XOR)方式实现拖放画动态直线
- db2分页语法