C语言多线程同步 -- 信号量semaphore.h
2016-02-24 13:43
591 查看
多线程读文件使用fopen,出现BUG,然后寻找同步方法,找到这个“信号量“。
首先需要用sem_init(); 初始化sem_t型变量,并设置初始信号量。比如设置为1.
每次调用sem_wait(sem_t *); 信号量减一,当调用sem_post(sem_t *); 信号量加一。
当信号量为0时,sem_wait(); 函数阻塞,等待信号量 >0 时,才进行。
sem_t 是共用体,定义如下。
首先需要用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 是共用体,定义如下。
相关文章推荐
- c++ 显示小数点后的0
- C++命名空间的使用实践
- [C++]隐式类类型转换(转)
- C++设计模式-1简单工厂模式
- c语言入门之项目3.9——输出一个“空”三角形
- c++STL中常用模板常用函数记录(新手向)
- C/C++——基本数据类型的大小并且sizeof(int *) = 8
- C语言日志的实现,用宏实现日志
- 程序员面试题精选100题(56)-C/C++/C#面试题(4)
- 程序员面试题精选100题(54)-C++/C#面试题(3)
- 程序员面试题精选100题(53)-C++/C#面试题(2)
- 程序员面试题精选100题(52)-C++面试题(1)
- C语言深度剖析-----函数与指针的分析
- 程序员面试题精选100题(45)-Singleton(C/C++/C#)
- Jni——java调用C++
- c语言入门之项目3.8——输出一个菱形
- C语言(变量的定义和类型的本质)
- C语言字符串操作总结大全(超详细)
- cout的二进制输出实现
- windows下配置CLion IDE