c++ - 一个线程结束后调用另一个线程中的方法

标签 c++ multithreading c++11 parallel-processing

我正在尝试并行化我的程序,但由于我对线程还很陌生,所以我遇到了一些问题。

我有两个属于同一个类的方法。其中一种方法在 for 循环中进行一些计算并将结果推送到 vector 中,另一种方法 (runTheResult) 获取 vector 并使用获得的 vector 启动线程。我希望在每次 runTheResult 完成结果时启动另一个线程来运行下一个获得的结果,同时将一次的最大线程数限制为 4。

我的程序结构如下:

void runTheResult(vector<double>& u){

//process 'u' and launch a thread 


};

void method(){

for(...){

//calculate

    for(...){

    //put the calculations in vector<double>result

    };

    runTheResult(result); 

};

};

我在谷歌上搜索了很多,其中一个解决方案是维护一个消息队列。然而,这个问题是,如果我实现一个查询,我将不得不在 while 循环中定期检查另一个线程的查询。如果我使用 while 循环,如 while(true){//check for new messages if the number of threads is less than five},我将失去很多处理能力,如果我选择将如果不满足条件就循环休眠,我会浪费处理能力。我在线程中运行的函数每个需要 2-5 秒,我必须处理大约 1k 到 50k 个函数,所以即使每个循环延迟一秒也是很多。

是否可以在每次 runTheResult 完成后在另一个线程中运行 runTheResult?还是有更好的方法来做到这一点?

最佳答案

其他人告诉您使用消息队列,因为这是最安全的方法。您的程序必须至少有一个用户(您或最终用户)可以与之交互的主线程。只要您的程序运行,该主线程就会一直循环。您在这里进行消息处理

// this is not actually running the result now
// this only sends it to the main thread that will run the result
void runTheResult(vector<double>& u){ 

    //process 'u' and launch a thread. 
    // @NOTE Launching a thread again will not be beneficial as it will still be blocked 
    // by the mutex

    // convert/store vector into Message. To make it usable for other types
    // or you can just change Message to double
    Message u_message = to_message(u)

    std::lock_guard<std::mutex> lock(message_mutex);
    messages_shared.append(u_message);

};

void method() // runs on worker thread
{
    for(...){

    //put the calculations in vector<double>result

    };

    runTheResult(result);
}

void getMessages_safe(std::vector<Messages>& outMessages_safe)
{
    // as Ted Lyngo suggests, using lock_guard is best practice. See edit for alternative
    std::lock_guard<std::mutex> lock(message_mutex);
    outMessages_safe = messages_shared;
    messages_shared.clear();
}

std::vector<Message> messages_shared;
std::mutex message_mutex;

void main() { // this runs on the very first thread of the program
  while (isProgramRunning)
  {
      std::vector<Message> messages_safe; // safe to access by this thread only
      getMessages_safe(messages_safe);

      // dispatch messages to whoever needs it

      // launch worker thread
  }
}

关于c++ - 一个线程结束后调用另一个线程中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56153441/

相关文章:

c++ - uint32_t 指针指向与 uint8_t 指针相同的位置

c++ - 有没有办法递归地使用类模板参数推导指南? (图灵完备了吗)

c++ - 何时使用 Visual Studio 附加依赖项?

java - 多线程环境下使用的Hashmap

multithreading - MSAA 不在主线程中产生新行为

c++ - 我如何将 std::get 作为参数传递给模板函数?

c++ - "#define"与 "#define 1"

c# - Silverlight 中的互斥体

c++ - rethrow_exception 真的可以抛出相同的异常对象,而不是一个拷贝吗?

c++ - FBString 的小字符串优化是否依赖未定义行为?