“读-修改-写”问题

“读-修改-写”问题

“读-修改-写”问题是针对IO作为输出时,由于位操作指令修改某一位IO输出时,可能导致的其他IO输出不正确。具体如下:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
者与问题是指多个进程同时访问共享资源的问题。在者与问题中,有若干个者进程和一个者进程,它们共享一个资源。 者进程只是取资源,不修改资源;者进程则修改资源。在同一时刻,只能有一个进程可以修改资源,但可以有多个进程同时取资源。者和者之间必须互斥,即不能同时访问资源,否则会出现数据不一致的情况。 下面是一个基于信号量的实现者与问题的示例代码: ```c++ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #define MAX_READERS 5 sem_t mutex, write_mutex; int reader_count = 0; void *writer(void *arg) { int id = *(int *)arg; while (1) { sem_wait(&write_mutex); printf("Writer %d is writing...\n", id); sleep(1); // 模拟操作 printf("Writer %d finished writing.\n", id); sem_post(&write_mutex); sleep(3); // 模拟操作间隔 } pthread_exit(NULL); } void *reader(void *arg) { int id = *(int *)arg; while (1) { sem_wait(&mutex); reader_count++; if (reader_count == 1) { sem_wait(&write_mutex); } sem_post(&mutex); printf("Reader %d is reading...\n", id); sleep(1); // 模拟操作 printf("Reader %d finished reading.\n", id); sem_wait(&mutex); reader_count--; if (reader_count == 0) { sem_post(&write_mutex); } sem_post(&mutex); sleep(2); // 模拟操作间隔 } pthread_exit(NULL); } int main() { pthread_t readers[MAX_READERS], writer_thread; int i, writer_id = 1, reader_ids[MAX_READERS]; sem_init(&mutex, 0, 1); // 初始化互斥信号量 sem_init(&write_mutex, 0, 1); // 初始化信号量 // 创建者线程 if (pthread_create(&writer_thread, NULL, writer, &writer_id) != 0) { perror("pthread_create error"); exit(EXIT_FAILURE); } // 创建者线程 for (i = 0; i < MAX_READERS; i++) { reader_ids[i] = i + 1; if (pthread_create(&readers[i], NULL, reader, &reader_ids[i]) != 0) { perror("pthread_create error"); exit(EXIT_FAILURE); } } // 等待所有线程结束 pthread_join(writer_thread, NULL); for (i = 0; i < MAX_READERS; i++) { pthread_join(readers[i], NULL); } sem_destroy(&mutex); // 销毁互斥信号量 sem_destroy(&write_mutex); // 销毁信号量 return 0; } ``` 在上面的代码中,我们使用了两个信号量:互斥信号量 mutex 和信号量 write_mutex。者进程和者进程必须先获取互斥信号量 mutex,然后者进程会增加 reader_count 的计数器,如果是第一个者,就获取信号量 write_mutex。者进程完成操作后,会将计数器减1;如果是最后一个者,就释放信号量 write_mutex。者进程则直接获取信号量 write_mutex,完成操作后释放信号量 write_mutex。这样就保证了者和者之间的互斥性。 需要注意的是,在本例中者和者线程都是无限循环的,为了退出程序,可以使用 Ctrl+C 终止程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值