C语言多线程同步 -- 信号量semaphore.h
来源:互联网 发布:继电器仿真软件 编辑:程序博客网 时间:2024/05/19 04:52
多线程读文件使用fopen,出现BUG,然后寻找同步方法,找到这个“信号量“。
首先需要用sem_init(); 初始化sem_t型变量,并设置初始信号量。比如设置为1.
每次调用sem_wait(sem_t *); 信号量减一,当调用sem_post(sem_t *); 信号量加一。
当信号量为0时,sem_wait(); 函数阻塞,等待信号量 >0 时,才进行。
#include <stdio.h>#include <pthread.h>#include <semaphore.h>typedef struct{sem_t *lock;int num;}STRUCT;void test(void * obj){STRUCT *point = (STRUCT *)obj;sem_t *semlock = point->lock;sem_wait(semlock);FILE *f = fopen("test.txt","a");if(f==NULL)printf("fopen is wrong\n");printf("sem_wait %d\n",point->num);int j=0;for(j=0;j<30;j++)fprintf(f,"%c111111111111\n",'a'+point->num);fclose(f);sem_post(semlock);return;}int main(){pthread_t pid[20]; // pthread_t pid;int ret,i=0;STRUCT obj[13];sem_t semlock;if(sem_init(&semlock,0,1)!=0) // 此处初始信号量设为1. 第二个参数为0表示不应用于其他进程。printf("sem_init is wrong\n");for(i=0;i<10;i++){obj[i].num = i;obj[i].lock = &semlock;ret = pthread_create(&pid[i],NULL,(void *)test,&obj[i]);if(ret!=0){printf("create thread wrong %d!!\n",i);return 0;}}for(i=0;i<10;i++)pthread_join(pid[i],NULL); // 等待其他线程结束,如果没有这里,主线程先结束,会释放pid[]及obj[],则出现BUG。 return 0;}
sem_t 是共用体,定义如下。
0 0
- C语言多线程同步 -- 信号量semaphore.h
- 多线程7:经典线程同步 信号量Semaphore
- 多线程之实现同步的信号量Semaphore
- 多线程同步-信号量(深入理解Semaphore)
- C++多线程同步之Semaphore(信号量)
- 多线程(C++)同步Semaphore
- 多线程(C++)同步Semaphore
- 线程同步----信号量(Semaphore)
- 信号量同步 semaphore
- 线程同步----信号量(Semaphore)
- 线程同步--信号量Semaphore
- NET多线程同步方法详解(五):信号量(Semaphore)
- NET多线程同步方法详解(五):信号量(Semaphore)
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
- 多线程之八 经典线程同步 信号量Semaphore
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
- 秒杀多线程第八篇 经典线程同步 信号量Semaphore
- 一起学习PySNMP——理解什么是MIB
- PySNMP学习笔记(一)
- 关于钥匙串
- PySNMP学习笔记(二)
- androidmanifest.xml权限中文说明
- C语言多线程同步 -- 信号量semaphore.h
- 华为9306查看光功率
- python 字符串/元组/列表/字典互转
- 华为数通产品MIB参考
- 将博客搬至CSDN
- linux shell 操作mysql
- linux下php支持snmp
- 用repcache 主备来解决缓存备份和缓存同步问题
- linux下php加载mssql模块