实验2-线程同步与通信

实验2-线程同步与通信

线程同步

设计并实现一个计算线程与一个I/O线程共享缓冲区的同步与通信, 程序要求:
两个线程,共享公共变量a;
线程1负责计算(1到100的累加,每次加一个数);
线程2负责打印(输出累加的中间结果);
主进程等待子线程退出。

(1)采用读写锁来实现

  pthread_rwlock_t rwlock; 

  ---创建一把读写锁

  ---创建一个写的线程

  pthread_create(&ptid[0],NULL,writeNum,NULL); //写函数
    for(i = 1; i<= 100; i++) {
        pthread_rwlock_wrlock(&rwlock); //写锁
        num = num + i;
        pthread_rwlock_unlock(&rwlock); //释放锁资源
        sleep(1);
    }

  ---创建读线程 以及线程函数执行内容

  pthread_create(&ptid[1],NULL,readNum,NULL); //读函数
while(1) {
        pthread_rwlock_rdlock(&rwlock); //加锁
        printf("--- read_number -> %d\n",num);
        pthread_rwlock_unlock(&rwlock); //释放锁资源
        sleep(1);
}

  ---回收读写线程

    pthread_join(ptid[0], NULL);
    pthread_join(ptid[1], NULL);

  ---结果:

 (2)采用信号灯实现

  ---创建信号灯

1 semId = semget((key_t)IPC_PRIVATE,2,IPC_CREAT|0666); //
2 if(semId == -1) {
3     perror("semget failed");
4     return 0;
5 }

  --给信号灯赋值:上面我们创建了两个信号灯

1 union semun un1, un2;
2 un1.val = 0;
3 if((semctl(semId,0,SETVAL,un1)) == -1) {
4     perror("init un1 failed");
5 }
6 un2.val = 1;
7 if((semctl(semId,1,SETVAL,un2)) == -1) {
8     perror("init un2 failed");
9 }

  ---创建两个进程:一个执行加i并写num操作,一个执行读num操作

1 pthread_create(&ptid[0],NULL,(void *)writeNum,NULL); //写函数
2 
3 for(i = 1; i<= 100; i++) {
4     P(semId, 1);
5     num = num + i;
6     V(semId, 0);
7     sleep(0.6);
8 }
1 pthread_create(&ptid[1],NULL,(void *)readNum,NULL); //读函数
2 
3 while(1) {
4     P(semId, 0);
5     printf("--- read_number -> %d\n",num);
6     V(semId, 1);
7     sleep(0.6);
8 }

  ---P、V操作函数

1 struct sembuf sem;    
2 sem.sem_num = index; //信号量编号
3 sem.sem_op = -1; //P操作-1
4 sem.sem_flg = 0; //操作标记:0或IPC_NOWAIT等
5 if(semop(semId,&sem,1) == -1){        
6    //1:表示执行命令的个数
7    perror("semp P operator failed");
8    exit(1);
9 }
1 struct sembuf sem;    
2 sem.sem_num = index;
3 sem.sem_op =  1;
4 sem.sem_flg = 0;
5 if(semop(semId,&sem,1) == -1){        
6         //1:表示执行命令的个数
7         perror("semp V operator failed");
8         exit(1);
9 }

  ---运行结果:

posted @ 2018-12-05 16:01 风沙迷了眼 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含代码和文档 实验实验内容 编写程序,演示多进程并发执行和进程软中断、管道通信。 父进程使用系统调用pipe( )建立一个管道,然后使用系统调用fork()创建两个子进程,子进程1和子进程2; 子进程1每隔1秒通过管道向子进程2发送数据: I send you x times. (x初值为1,每次发送后做加一操作) 子进程2从管道读出信息,并显示在屏幕上。 父进程用系统调用signal()捕捉来自键盘的中断信号(即按Ctrl+C键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child Process l is Killed by Parent! Child Process 2 is Killed by Parent! 父进程等待两个子进程终止后,释放管道并输出如下的信息后终止 Parent Process is Killed! 实验实验内容 过Linux多线程与信号灯机制,设计实现计算线程与I/O线程共享缓冲区同步通信。 程序要求:两个线程,共享公共变量a 线程1负责计算(1到100的累加,每次加一个数) 线程2负责打印(输出累加的中间结果) 实验实验内容 利用多个共享内存(有限空间)构成的环形缓冲,将源文件复制到目标文件,实现两个进程的誊抄。 实验实验内容 1、(1)Blink程序的编译和下载 (2)给Blink程序加入printf,在每次定时器事件触发点亮LED的同时通过串口显示信息 (3)修改BLink程序,只使用一个Timer,三个LED灯作为3位的二进制数表示(亮灯为1,不亮为0),按照0-7的顺序循环显示,同时将数值显示在终端上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值