Linux编程练习(一)—— 多线程+共享内存+线程信号量练习
来源:互联网 发布:js进度条特效 编辑:程序博客网 时间:2024/05/18 00:55
在ubuntu12.04下的共享内存+多线程+信号量练习实例。
问题:程序要求用多线程+共享内存+信号量,实现将一个文件中的内容写入到另一个空白文件中(读与写的操作必须分在两个线程中完成),要求文件内容的大小要远大于所用共享内存的大小。
分析:题目要求将一个文件(假设为in)中的数据存入到另一个空白文件(假如为out)中,而且要求共享内存的大小要小于文件传输内容的大小,因此我们就需要利用有限大小的共享内存和文件指针将in中的数据循环多次倒入到out文件中,而为了解决重复写入或是漏写等线程调度混乱造成的问题,需要在其中使用信号量加以同步控制。
具体实现如下:
/********************** 共享内存+多线程+线程信号量 应用例子*/#include <stdio.h>#include <string.h>#include <stdlib.h>#include <pthread.h>#include <semaphore.h>#include <sys/types.h>#include <sys/shm.h>#include <sys/ipc.h>sem_t bin_sem; //信号量int end_flag; //结束标志符char *sh_ptr;/* 向out文件中写数据 */void* Tid_write(void *a){ FILE *fp;fp = fopen("out", "w"); while(end_flag){sem_wait(&bin_sem);if(sh_ptr[0] != 0){fprintf(fp, "%s", sh_ptr);memset(sh_ptr, 0, sizeof(sh_ptr));}sem_post(&bin_sem);} fclose(fp); return (void*)0;}/* 从in文件中读数据 */void *Tid_read(void *arg){FILE *fp;fp = fopen("in", "r"); while(!feof(fp)){sem_wait(&bin_sem);if(sh_ptr[0] == 0){ fgets(sh_ptr, 10, fp); //printf("(%s)\n", sh_ptr); }sem_post(&bin_sem);}fclose(fp);end_flag = 0; return (void *)0;}int main(){ int shm_id; end_flag = 1; pthread_t tid_1, tid_2; int err_0, err_1, err_2; shm_id = shmget(IPC_PRIVATE, 15, IPC_CREAT|0600); //建立共享内存 if(shm_id == -1) { fprintf(stderr, "error"); return 0; } sh_ptr = (char *)shmat(shm_id, NULL, 0); memset(sh_ptr, 0, sizeof(sh_ptr)); err_0 = sem_init(&bin_sem, 0, 1);// 初始化信号量 if(err_0 < 0)fprintf(stderr, "sem_init error!"); err_1 = pthread_create(&tid_1, NULL, Tid_write, NULL); err_2 = pthread_create(&tid_2, NULL, Tid_read, NULL); if(err_1!=0 || err_2!=0) fprintf(stderr, "pthread error!"); pthread_join(tid_1, NULL); pthread_join(tid_2, NULL); shmdt(sh_ptr); //解除共享内存绑定 sem_destroy(&bin_sem);//释放信号量 printf("project is over!\n"); return 0;}
- Linux编程练习(一)—— 多线程+共享内存+线程信号量练习
- Linux编程练习 --多线程5--信号量(semaphore)
- Linux编程练习 --多线程5--信号量(semaphore)
- Linux编程练习 --多线程5--信号量(semaphore)
- linux c 多线程编程练习(一)
- Linux编程练习 --SystemV共享内存
- Linux编程练习 --SystemV信号灯(信号量)
- Linux编程练习 --多线程1--线程创建
- Linux编程练习 --多线程1--线程创建
- Linux编程练习 --多线程1--线程创建
- 共享内存的编程练习
- 多线程——线程练习
- linux 练习四 共享内存练习
- linux操作系统编程——共享内存读写(采用信号量进行同步互斥)
- linux c 多线程编程练习(二)
- linux c 多线程编程练习(三)
- linux共享内存+信号量编程示例
- linux+信号量+共享内存编程实例
- 安装r8168
- linux service开机启动
- 孙子兵法(始计)
- Samba服务器
- c#构造函数
- Linux编程练习(一)—— 多线程+共享内存+线程信号量练习
- 输出某个数的反序数
- 在OnCtreate方法或者adapter中获取控件的宽高和位置
- 北大ACM试题分类 - 实时更新我所有的解题报告链接
- 数据结构-双向链表
- Android-开启蓝牙
- ExtJs中decode与encode
- Lisp语言发明者 人工智能奠基人 John McCarthy
- OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows,