相关疑难解决方法(0)

停止等待std :: condition_variable的C++ 11 std :: threads

我试图理解新的C++ 11标准中的基本多线程机制.我能想到的最基本的例子如下:

  • 生产者和消费者在不同的线程中实现
  • 生产者在队列中放置一定数量的项目
  • 如果存在任何存在,则消费者从队列中获取项目

这个例子也被用在许多关于多线程的学校书籍中,关于通信过程的一切都很好.但是,在停止使用者线程时我遇到了问题.

我希望消费者运行直到它获得明确的停止信号(在大多数情况下,这意味着我等待生产者完成所以我可以在程序结束之前停止消费者).不幸的是,C++ 11线程缺少一种中断机制(例如我从Java中的多线程中知道).因此,我必须使用标志isRunning来表示我想要一个线程停止.

现在的主要问题是:在我停止生产者线程之后,队列为空并且消费者在等待a condition_variable再次填充队列时获取信号.所以我需要通过notify_all()在退出之前调用变量来唤醒线程.

我找到了一个有效的解决方案,但似乎有些混乱.下面列出了示例代码(很抱歉,但不知何故,我无法为"最小"最小示例减少代码大小):

队列类:

class Queue{
public:
    Queue() : m_isProgramStopped{ false } { }

    void push(int i){
        std::unique_lock<std::mutex> lock(m_mtx);
        m_q.push(i);
        m_cond.notify_one();
    }

    int pop(){
        std::unique_lock<std::mutex> lock(m_mtx);
        m_cond.wait(lock, [&](){ return !m_q.empty() || m_isProgramStopped; });

        if (m_isProgramStopped){
            throw std::exception("Program stopped!");
        }

        int x = m_q.front();
        m_q.pop();

        std::cout << "Thread " << std::this_thread::get_id() << " popped " << x << "." << std::endl;
        return x;
    }

    void stop(){
        m_isProgramStopped = …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading interrupt condition-variable c++11

30
推荐指数
1
解决办法
2万
查看次数

等待线程直到条件发生

我想等待在Simultaneous模拟器中执行的2个线程的一个线程,直到条件发生,可能是在模拟器中运行程序1000个或更多周期后发生的条件,条件发生后再次执行等待的线程,我该怎么做?

c++ multithreading simulator

22
推荐指数
2
解决办法
7万
查看次数

通过同步延长线程的生命周期(C++ 11)

我有一个程序,其函数将指针作为arg和main.主要是创建n个线程,每个线程根据传递的内容在不同的内存区域运行arg.然后连接线程,主要在区域之间执行一些数据混合,并创建n个新线程,这些线程执行与旧线程相同的操作.

为了改进程序,我想保持线程活着,消除创建它们所需的长时间.线程应在主要工作时休眠,并在必须再次出现时通知.同样,主要应该在线程工作时等待,就像连接一样.

我无法最终实现这一点,总是陷入僵局.

简单的基线代码,任何有关如何修改它的提示将非常感激

#include <thread>
#include <climits>

...

void myfunc(void * p) {
  do_something(p);
}

int main(){
  void * myp[n_threads] {a_location, another_location,...};
  std::thread mythread[n_threads];
  for (unsigned long int j=0; j < ULONG_MAX; j++) {
    for (unsigned int i=0; i < n_threads; i++) {
      mythread[i] = std::thread(myfunc, myp[i]);
    }
    for (unsigned int i=0; i < n_threads; i++) {
      mythread[i].join();
    }
    mix_data(myp); 
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ multithreading thread-safety c++11

15
推荐指数
3
解决办法
1万
查看次数

如何在C ++中实现阻塞队列以处理线程之间的数据?

我需要制作一个具有两个线程的应用程序。一个将产生数据(文件路径和对该路径要执行的操作-创建/更新/删除),而另一个线程将需要使用此数据并实际执行任务。

为此,我认为要有一个队列,并从一个线程将数据放入队列,从另一个线程取数据并按顺序执行操作。

我的问题是如何使这些线程之间的数据可共享,然后如何在等待数据放入队列时使第二个线程阻塞?仅仅有一段时间检查队列是否不为空,会像疯了一样吞噬CPU。每隔几毫秒或几秒钟添加一次“睡眠”检查将没有效率。

如何才能做到这一点?有没有实现此类数据的库?

c++ c++11

1
推荐指数
1
解决办法
2117
查看次数