zoukankan      html  css  js  c++  java
  • C++多线程join同步问题

      其实就是想记录一下自己的想法,就是关于多个线程的执行顺序的思考。之前一直觉得std::thread::join会阻塞其他线程的运行,其实并不是这样子的。举个例子

    std::vector<std::thread *>lt;
    
     for(int i = 35 ; i >20 ; i--)
    {
      std::thread *t= new thread(show,std::to_string(i)+"ccccc");
      lt.emplace_back(t);
    }
    
    for(auto &it:lt)
    {
        it->join();
    }
    

      想想看,上面这个例子,它运行起来之后是啥状态,不管show函数做了啥,可以看到有15个线程会被创建,然后放到lt这个容器里面,然后逐个被join,然后主线程
    在这个位置被阻塞。但是思考一下,逐个进行join的话,第一个join执行的时候,如果第一个线程没有执行完,那么,就直接阻塞在这里来。换句话说,即使后面的线程
    还没有被执行join函数,但是也相当于是对主线程进行了阻塞。然后当后面线程执行完之后才可能被执行join函数。所以这样写是同步的。
      但是如果是这样子呢。

    std::vector<std::thread *>lt;
    
     for(int i = 35 ; i >20 ; i--)
    {
      std::thread *t= new thread(show,std::to_string(i)+"ccccc");
            t->join();
      lt.emplace_back(t);
    }
    

      这样子应该是顺序执行了吧,我测试的结果是可能后面都没有开起来多的线程,而是优化成了顺序执行。根本没有并行执行

    可以图形化看到的东西坚决不会用命令行ORZ

  • 相关阅读:
    git ssh keys
    git 修改 email
    git 撤销commit
    企微调试模式
    ORACLE 根据某个字段固定值进行分区
    Apache FtpClient login失败
    Oracle序列
    Oracle merage into
    Oracle all_tables 以及常用sql
    性能优化-使用高性能的库fastutil
  • 原文地址:https://www.cnblogs.com/IGNB/p/10522252.html
Copyright © 2011-2022 走看看