Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程中的多线程实现_C++_Multithreading_C++11_Queue - Fatal编程技术网

C++ 线程中的多线程实现

C++ 线程中的多线程实现,c++,multithreading,c++11,queue,C++,Multithreading,C++11,Queue,我正在实现从一个线程到另一个线程的消息传递 线程1:回调函数在库中注册,在回调时,函数被调用,需要发送到另一个线程进行处理,因为这需要时间 线程2:线程检查是否有任何消息可用(队列中的preferrednas)并处理相同的消息 使用互斥体的条件变量使用是否是开始考虑线程2的正确方法?线程1可以添加多条其他消息的处理需要时间?通常,互斥体用于控制线程之间的访问;但对于线程之间的通知来说并不太好 如果将Thread2设计为在条件下等待;您可以简单地处理从Thread1接收到的消息 这将是一个粗略的实

我正在实现从一个线程到另一个线程的消息传递

线程1:回调函数在库中注册,在回调时,函数被调用,需要发送到另一个线程进行处理,因为这需要时间

线程2:线程检查是否有任何消息可用(队列中的preferrednas)并处理相同的消息


使用互斥体的条件变量使用是否是开始考虑线程2的正确方法?线程1可以添加多条其他消息的处理需要时间?

通常,互斥体用于控制线程之间的访问;但对于线程之间的通知来说并不太好

如果将Thread2设计为在条件下等待;您可以简单地处理从Thread1接收到的消息

这将是一个粗略的实现


void pushFunction
{
   // Obtain the mutex (preferrably scoped lock in boost or c++17)
    std::lock_guard lock(myMutex);
    const bool empty = myQueue.empty();
    myQueue.push(data);
    lock.unlock();

    if(empty)
    {
        conditionVar.notify_one();

    }
}
在线程2中


void waitForMessage()
{
    std::lock_guard lock(myMutex);
    while (myQueue.empty())
    {
        conditionVar.wait(lock);
    }

    rxMessage = myQueue.front();
    myQueue.pop();

}
需要注意的是,该条件可能会被错误唤醒,因此将其保持在“while empty”循环中很重要

使用互斥体的条件_变量是否是开始考虑线程2的正确方法?线程1可以添加多条其他消息的处理需要时间

关于如何使用条件变量和互斥量的问题有点含糊不清,但是是的,这类对象肯定会有作用。高级视图应该是这样的:

  • 互斥锁将保护对消息队列的访问。任何线程对队列的任何读取或修改都只能在保持互斥锁锁定的情况下进行
  • 如果消息处理线程已准备好处理新消息,但队列为空,则消息处理线程将在CV上阻塞
  • 消息生成线程将在每次将新消息排入队列时向CV发送信号
这正是生产者/消费者的问题,使用该术语,您可以找到许多关于此类问题的信息

<>但请注意,已经有多个消息队列实现已经完全可以满足您的目的(“消息队列”实际上是这些术语的一个标准术语),所以您应该考虑是否真的要重新发明这个轮子。