设为首页 加入收藏

TOP

Linux编程练习(一)—— 多线程+共享内存+线程信号量练习
2014-11-24 02:29:33 来源: 作者: 【 】 浏览:0
Tags:Linux 编程 练习 线程 共享 内存 信号

问题:程序要求用多线程+共享内存+信号量,实现将一个文件中的内容写入到另一个空白文件中(读与写的操作必须分在两个线程中完成),要求文件内容的大小要远大于所用共享内存的大小。


分析:题目要求将一个文件(假设为in)中的数据存入到另一个空白文件(假如为out)中,而且要求共享内存的大小要小于文件传输内容的大小,因此我们就需要利用有限大小的共享内存和文件指针将in中的数据循环多次倒入到out文件中,而为了解决重复写入或是漏写等线程调度混乱造成的问题,需要在其中使用信号量加以同步控制。


具体实现如下:


/*********************
* 共享内存+多线程+线程信号量 应用例子
*/
#include
#include
#include
#include
#include
#include
#include
#include


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


推荐阅读:


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python 中is和= = 的比较 下一篇Linux编程练习(二)—— Linux下..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: