使用C中的线程交替打印奇数和偶数打印

新手上路,请多包涵

使用线程进行奇偶数打印 我遇到了这个问题,并想讨论 C++ 中的解决方案。我能想到的使用 2 个二进制信号量奇数和偶数信号量。偶数信号量初始化为 1,奇数信号量初始化为 0。

 **T1 thread function**
funOdd()
{
  wait(even)
  print odd;
  signal(odd)
}

**T2 thread function**
funEven()
{
  wait(odd)
  print even
  signal(even)
}

除此之外,如果我的函数只生成数字并且有第三个线程 T3 将打印这些数字,那么理想的设计应该是什么?我使用了一个数组,其中奇数将放置在奇数位置,偶数将放置在偶数位置。 T3 将从该数组中读取,这将避免对该数组的任何线程安全,如果 T3 没有找到任何索引,那么它将等待该索引被填充。另一种解决方案是使用一个队列,该队列将具有一个互斥体,T1 和 T2 在插入时可以使用该互斥体。

请对此解决方案发表评论,以及如何提高效率。

编辑使问题更清楚:总体问题是我有两个生产者(T1,T2)和一个消费者(T3),我的生产者是相互依赖的。

原文由 user258367 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 953
1 个回答

使用条件变量

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

std::mutex mu;
std::condition_variable cond;
int count = 1;

void PrintOdd()
{
    for(; count < 100;)
    {
        std::unique_lock<std::mutex> locker(mu);
        cond.wait(locker,[](){ return (count%2 == 1); });
        std::cout << "From Odd:    " << count << std::endl;
        count++;
        locker.unlock();
        cond.notify_all();
    }

}

void PrintEven()
{
    for(; count < 100;)
    {
        std::unique_lock<std::mutex> locker(mu);
        cond.wait(locker,[](){ return (count%2 == 0); });
        std::cout << "From Even: " << count << std::endl;
        count++;
        locker.unlock();
        cond.notify_all();
    }
}

int main()
{
    std::thread t1(PrintOdd);
    std::thread t2(PrintEven);
    t1.join();
    t2.join();
    return 0;
}

原文由 Ankur 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏