POSIX信号量实现互斥
来源:互联网 发布:三峡大学网络课程 编辑:程序博客网 时间:2024/06/05 18:46
采用POSIX信号量实现互斥原语,实现线程间同步
/* * 采用信号量实现互斥原语 */#include <stdio.h>#include <stdlib.h>#include <semaphore.h>#include <unistd.h>#include <errno.h>#include <limits.h>#include <sys/types.h>#include <fcntl.h>#include <pthread.h>#define MAXNUM 10000//用一个结构体封装命名信号量struct slock{ sem_t* pSem; char name[_POSIX_NAME_MAX];};//为信号量结构体分配内存struct slock* s_alloc(){ struct slock* sp; static int cnt; if((sp = (struct slock*)malloc(sizeof(struct slock))) == NULL) return NULL; do { snprintf(sp->name, sizeof(sp->name), "/%ld.%d", (long)getpid(), cnt++); sp->pSem = sem_open(sp->name, O_CREAT|O_EXCL, S_IRWXU, 1); } while((sp->pSem == SEM_FAILED) && (errno == EEXIST)); if(sp->pSem == SEM_FAILED) { free(sp); return NULL; } sem_unlink(sp->name); return sp;}//释放内存void s_free(struct slock* sp){ if(sp != NULL) { sem_close(sp->pSem); free(sp); sp = NULL; }}//互斥lockint s_lock(struct slock* sp){ return sem_wait(sp->pSem);}//互斥unlockint s_unlock(struct slock* sp){ return sem_post(sp->pSem);}//互斥trylockint s_trylock(struct slock* sp){ return sem_trywait(sp->pSem);}//线程函数static void* th_fun1(void* pArg);static void* th_fun2(void* pArg);//封装结构体作为参数传给线程struct foo{ int count; struct slock* pslock;};int main(){ int err; pthread_t tid1, tid2; struct foo obj; obj.count = 0; if((obj.pslock = s_alloc()) == NULL) return 0; //创建线程 err = pthread_create(&tid1, NULL, th_fun1, (void*)&obj); if(err != 0) { perror("pthread_create error"); exit(1); } err = pthread_create(&tid2, NULL, th_fun2, (void*)&obj); if(err != 0) { perror("pthread_create error"); exit(1); } //在主线程中等待线程退出 pthread_join(tid1, NULL); printf("thread 1 exit\n"); pthread_join(tid2, NULL); printf("thread 2 exit\n"); s_free(obj.pslock); exit(0);}static void* th_fun1(void* pArg){ while(1) { struct foo* pObj = (struct foo*)pArg; s_lock(pObj->pslock); if(pObj->count == MAXNUM) { s_unlock(pObj->pslock); break; } pObj->count++; printf("thread 1 print count: %d\n", pObj->count); s_unlock(pObj->pslock); } return ((void*)1);}static void* th_fun2(void* pArg){ while(1) { struct foo* pObj = (struct foo*)pArg; s_lock(pObj->pslock); if(pObj->count == MAXNUM) { s_unlock(pObj->pslock); break; } pObj->count++; printf("thread 2 print count: %d\n", pObj->count); s_unlock(pObj->pslock); } return ((void*)2);}
参考:APUE第三版第15章
阅读全文
0 0
- POSIX信号量实现互斥
- 线程同步与互斥:POSIX无名信号量
- 进程同步与互斥:POSIX有名信号量
- 线程同步与互斥:POSIX无名信号量
- 进程同步与互斥:POSIX有名信号量
- Linux互斥与同步应用(四):posix信号量的互斥与同步
- bash实现互斥、信号量的方法
- 使用信号量实现线程互斥
- 同步和互斥的POSIX支持(读写锁、信号量和记录锁)
- 同步和互斥的POSIX支持(读写锁、信号量和记录锁)
- 同步和互斥的POSIX支持(读写锁、信号量和记录锁)
- Linux系统编程——线程同步与互斥:POSIX无名信号量
- Linux系统编程——进程同步与互斥:POSIX有名信号量
- 【Linux系统编程】线程同步与互斥:POSIX无名信号量
- 【Linux系统编程】进程同步与互斥:POSIX有名信号量
- Linux系统编程——线程同步与互斥:POSIX无名信号量
- Linux系统编程——进程同步与互斥:POSIX有名信号量
- 互斥信号量 二进制信号量
- Java-jar包的简单操作
- JavaScript中的字符串,数组,替换
- A-B Game --贪心
- 最小生成树(MST)的Kruskal实现
- DOM节点访问关系与操作示例
- POSIX信号量实现互斥
- 谷歌正考虑商用量子计算服务
- 《致橡树》 舒婷
- Eclipse 使用mybatis generator插件自动生成代码
- vim常用命令附带几个Markdown常用数学符号
- Vue axios与FormData结合提交文件,并且展示用户图片文件
- Annotation成员的读取
- SPI总线的初步认识
- 字符串