2020-12-04 C++ 用条件锁实现进程执行顺序控制

C++ 用条件锁实现进程执行顺序控制代码输出结果参考代码让4个进程按顺序执行,并通过init(j)函数控制先执行的进程j。x=40说明锁机制成功顺序输出ABCD…说明顺序执行成功首字母输出ABCD…、BCDABCD…、CDABCD…、DABCD…说明控制先执行的进程成功。#include <iostream>#include <mutex>#include <thread>#include <condition_variable>usin
摘要由CSDN通过智能技术生成

C++ 用条件锁实现进程执行顺序控制

代码

让4个进程按顺序执行,并通过init(j)函数控制先执行的进程j
x=40说明锁机制成功
顺序输出ABCD…说明顺序执行成功
首字母输出ABCD…、BCDABCD…、CDABCD…、DABCD…说明控制先执行的进程成功。

#include <iostream>
#include <mutex>
#include <thread>
#include <condition_variable>

using namespace std;

mutex mtx;
condition_variable cv[4];
bool ready=false;
int turn=-1;

void fun(int *x,char c){
    int idx=c-'A';
    int next_idx=idx+1;
    if(idx==3) next_idx=0;

    for(int i=0;i<10;i++){
        unique_lock<mutex> ulock(mtx);
        while(!ready || turn!=idx) cv[idx].wait(ulock);

        //mtx.lock();
        int v=*x+1;
        this_thread::sleep_for(chrono::milliseconds(10));
        *x=v;
        cout<<c;
        //mtx.unlock();
        turn++;
        if(turn==4) turn=0;

        cv[next_idx].notify_one();
    }
}

void init(in
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您介绍一下如何用C++模拟几个进程执行过程,并使用信号量解决生产者-消费者问题。 首先,我们来了解一下生产者-消费者问题。生产者-消费者问题是指有一个缓冲区,生产者向其中添加数据,而消费者则从中取出数据。生产者和消费者在执行过程中需要同步,以保证数据的正确性和避免死。 接下来,我们可以使用信号量来解决这个问题。信号量是一种计数器,用于同步进程之间的操作。我们可以使用两个信号量,一个用于控制生产者进程的访问,一个用于控制消费者进程的访问。当缓冲区满时,生产者应该等待消费者取走数据后才能添加数据;而当缓冲区为空时,消费者应该等待生产者添加数据后才能取出数据。这样就可以保证生产者和消费者的操作顺序。下面是一个简单的代码示例: ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> using namespace std; const int BUFFER_SIZE = 10; // 缓冲区大小 queue<int> buffer; // 缓冲区 mutex mtx; // 互斥 condition_variable not_full_cv; // 缓冲区不满的条件变量 condition_variable not_empty_cv; // 缓冲区不空的条件变量 int count = 0; // 缓冲区中元素的数量 void producer() { for (int i = 0; i < 20; ++i) { unique_lock<mutex> lock(mtx); while (count == BUFFER_SIZE) { not_full_cv.wait(lock); } buffer.push(i); ++count; cout << "producer: " << i << endl; not_empty_cv.notify_one(); } } void consumer() { for (int i = 0; i < 20; ++i) { unique_lock<mutex> lock(mtx); while (count == 0) { not_empty_cv.wait(lock); } int num = buffer.front(); buffer.pop(); --count; cout << "consumer: " << num << endl; not_full_cv.notify_one(); } } int main() { thread t1(producer); thread t2(consumer); t1.join(); t2.join(); return 0; } ``` 在这个例子中,我们使用了一个队列作为缓冲区,生产者向其中添加数据,消费者从中取出数据。互斥用于保护缓冲区的访问,生产者和消费者在访问缓冲区时需要获取该。当缓冲区满时,生产者等待缓冲区不满的条件变量;当缓冲区为空时,消费者等待缓冲区不空的条件变量。当生产者添加数据后,会通知消费者;当消费者取出数据后,会通知生产者。这样就可以保证生产者和消费者的操作顺序,避免死。 希望这个例子能够帮助您了解如何使用信号量解决生产者-消费者问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值