C++中如何正确协作多个线程?

发布于 2022-09-03 08:04:55 字数 561 浏览 12 评论 0

任务关系

我想写一个多线程的程序用于异步加载创建纹理图像,现在有这种设想,大致的先后顺序流程如图所示。其中线程B是主线程,不能阻塞线程A是加载线程用于解析文件格式和拷贝数据。线程C是渲染线程,加载进来的图像纹理都通过线程C调用API存在显存中。
由于第一次写多线程程序,遇到一个问题:
应该如何协作同步这些线程,使得执行顺序正确,并保持相对高的效率,应该使用C++中哪些对应的函数和功能?需要实现哪些多线程的概念呢?如果可以的话求写一个大概的实现?

现在我同步线程是用了一堆bool类型的变量和while来阻塞线程AC,我感觉这样可能有问题。由于一些实现上的原因,方案本身不能修改,所以只问一下在代码实现上的问题,希望得到高手解答,非常感谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挖鼻大婶 2022-09-10 08:04:55

每个线程有一个事件循环就可以了,有事件就处理,没事件就阻塞在队列.

事件循环可以用std::thread, std::mutex, std::condition_variable, std::queue, std::function组合起来,嫌麻烦直接用boost::asio::io_service,三个线程run不同的io_service.

用起来就是 A POST B, B POST C, C POST A.
需要注意的地方就是异步投递用智能指针引用资源,要不就纯拷贝,可以移动就移动,还有共享资源的竞争.
下面代码看起来比较难看,但是差不多就是这个意思.

event_loop A;
event_loop B;
event_loop C;

int main()
{
  std::thread([]() {
    A.run();
  }).detach();
  std::thread([]() {
    B.run();
  }).detach();
  std::thread([]() {
    C.run();
  }).detach();

  while(true) {
    std::string cmd_a;
    std::cin >> cmd_a;

    A.post([cmd_a]() {
      some_cmd a = parse(cmd_a);
      B.post([a]() {
        some_argv argv = parse(a);
        C.post([argv]() {
          some_img_path img_path = proc(argv);
          A.post([img_path]() {
            copy(img_path);
            C.post([img_path]() {
              close(img_path);
            });
          });
        });
      });
    });
  }
}
温馨耳语 2022-09-10 08:04:55

最好说明一下所用的c++版本(c++98,c++11,c++14...?)以及所用的操作系统(windows,Linux...?)。不同的组合,有不同的多线程机制。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文