C++ 异步线程在c+中的实现+;

C++ 异步线程在c+中的实现+;,c++,linux,multithreading,C++,Linux,Multithreading,我在c++11中找不到异步线程的正确用法。我想做的是,我想spwan线程,每个线程都将同时运行,而不会像thread.join()那样等待彼此,这会使其他线程等待当前线程完成。因此,在C++中是否有任何一个库可以使线程并行运行,而不必等待另一个线程完成。实际上,我想要的是,我想运行每个线程,这样他们就不必等待另一个完成,它的功能也可以同时执行,而不必等待其他人完成。 谢谢 库沙尔 编辑: 编辑::我在下面发布代码 #include <signal.h> #include <th

我在c++11中找不到异步线程的正确用法。我想做的是,我想spwan线程,每个线程都将同时运行,而不会像thread.join()那样等待彼此,这会使其他线程等待当前线程完成。因此,在C++中是否有任何一个库可以使线程并行运行,而不必等待另一个线程完成。实际上,我想要的是,我想运行每个线程,这样他们就不必等待另一个完成,它的功能也可以同时执行,而不必等待其他人完成。 谢谢 库沙尔

编辑: 编辑::我在下面发布代码

#include <signal.h>
#include <thread>
#include <algorithm>
#include <cstring>
#include <csignal>
#include "paho_client.h"
using namespace std;
vector<string>    topic_container{"rpi2/temp","sense                          /bannana","sense/util","mqtt/temp","sense/temp","sense/pine","sense/fortis/udap"};
 vector<paho_client> publisher;
 vector<paho_client> subscriber;
 int finish_thread=1;
 void Onfinish(int signum){
 finish_thread=0;
 exit(EXIT_FAILURE);
 }

 int main(int argc, char** argv) {
 signal(SIGINT, Onfinish);
 int topic_index;
 if(argc<3){
    cout<<"the format of starting commandline argument is"<<endl;              
    exit(1);
    }

    while(finish_thread!=0){
    //paho_client::get_library_handle();
    if(strcmp(argv[1],"create_publisher")){
        for(topic_index=0;topic_index<atoi(argv[2]);topic_index++){
            thread pub_th;
            pub_th = thread([ = ]() {
                paho_client client("publisher", "192.168.0.102", "9876",
                                   topic_container[topic_index].c_str());
                client.paho_connect_withpub();
              publisher.push_back(client);
            });
         pub_th.join();
        }
        vector<paho_client>::iterator it;
        int publisher_traverse=0;
        for(it=publisher.begin();it<publisher.end();publisher_traverse++){
           publisher[publisher_traverse].increment_count();
          publisher[publisher_traverse].get_count();
       }

   }
  }
 return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括“paho_client.h”
使用名称空间std;
向量主题容器{“rpi2/temp”、“sense/bannana”、“sense/util”、“mqtt/temp”、“sense/temp”、“sense/pine”、“sense/fortis/udap”};
矢量出版商;
矢量用户;
int finish_螺纹=1;
无效完成(内部信号){
精加工螺纹=0;
退出(退出失败);
}
int main(int argc,字符**argv){
信号(SIGINT、Onfinish);
国际主题索引;
如果(argc
我想首先启动所有发布服务器客户端(作为线程),然后
稍后发布来自每个线程的消息

pub_th.join()
错误地放置在线程启动的循环中,因此在启动下一个线程之前等待每个线程的终止。要让线程并行运行,只需移动
.join()
在该循环之外。当然,要访问循环体之后的线程,它们必须存储在某个地方,例如,在
向量中
-为此,将
的第一个
循环更改为

        vector <thread> pub_threads;
        for (topic_index=0; topic_index<atoi(argv[2]); topic_index++)
        {
            pub_threads.push_back(thread([ = ]() { /* whatever */ }));
        }
实际上,我在运行无限,而在 paho_客户端,因此第一个线程未完成… 该线程是连续运行的


当然,如果从未这样做过,那么按照定义,线程并行运行的
.join()

是没有意义的。调用
join
不会改变这一点(调用者除外).
join
用于等待线程完成。但它不会以某种方式阻止其他线程并行运行。您可能没有清楚地表达您的问题,或者您对线程的工作方式有一些根本性的误解。抱歉,我误解了我的问题线程确实并行运行,但我想要的是我想要线程不要等待其他人完成。他们应该在不等待的情况下同时运行其功能。然后不要调用
join
。就这么简单。你不必做任何事情来不等待。你只需要做一些事情(调用
join
)如果你真的想等待。那么你的想法是完全颠倒的。如果我不调用join,它会给出活动异常。我的意思是,如果我在线程上调用detach,它将不能保证我将获得所有线程的输出。换句话说,我希望所有线程运行其内部代码并输出其dataShow.your.code。正确的方法是不调用
join
在子线程中,但在主线程中调用
join
。如果您认为您已经这样做了,但仍然不起作用,那么我们无法帮助您,除非您显示代码。
        vector <thread> pub_threads;
        for (topic_index=0; topic_index<atoi(argv[2]); topic_index++)
        {
            pub_threads.push_back(thread([ = ]() { /* whatever */ }));
        }
        for (auto &th: pub_threads) th.join();