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;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生完孩子下奶疼怎么办 生完小孩没奶水怎么办 孩子半个月奶水越来越少怎么办 半个月后奶水越来越少怎么办 坐月子半个月奶水越来越少怎么办 孩子七个月奶水越来越少怎么办 生完孩子奶水越来越少怎么办 生完孩子回奶了怎么办 产妇3天没奶水怎么办 产后7天了奶水少怎么办 刚生完小孩没有奶水怎么办 突然就没奶水了怎么办 生完小孩没有奶水怎么办 生完宝宝没有奶怎么办 剖腹产奶涨的疼怎么办 生产一天了没奶怎么办 第一天断奶 奶水一直流出怎么办 新生儿刚出生没奶水怎么办 安卓手机死机了怎么办 婴幼儿几天不拉大便怎么办 樱桃吃多了胃不舒服怎么办 空腹吃水果胃不舒服怎么办 吃水果后胃不舒服怎么办 吃水果伤胃了怎么办 大人吃退烧药不出汗怎么办 稍微吃点凉水果胃就疼怎么办 1岁宝宝感冒发烧怎么办 3岁小儿反复发烧怎么办 热感冒喉咙疼要怎么办 孩子感冒咳嗽嗓子疼怎么办 孕妇感冒了嗓子疼咳嗽怎么办 4岁宝宝反复高烧怎么办 小孩吃完药不退烧怎么办 六个月婴儿发烧怎么办退烧快点 咳嗽20天老不好怎么办 吃过退烧药出汗怎么办 5岁儿童发烧39度怎么办 小孩烧到39度怎么办 儿童7岁发烧39度怎么办 发烧没药怎么办怎样退烧快 小孩发烧怎么办怎样退烧快