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+;+;线程):创建将侦听作业并在需要时并发执行它们的工作线程_C++_Multithreading_Parallel Processing - Fatal编程技术网

C++ (C+;+;线程):创建将侦听作业并在需要时并发执行它们的工作线程

C++ (C+;+;线程):创建将侦听作业并在需要时并发执行它们的工作线程,c++,multithreading,parallel-processing,C++,Multithreading,Parallel Processing,假设我们有两个工人。每个工人的id分别为0和1。另外,假设我们一直都有作业到达,每个作业也有一个标识符0或1,指定必须由哪个工人来完成此项工作 我想创建两个最初被锁定的线程,然后当两个作业到达时,解锁它们,每个作业都执行它们的作业,然后再次锁定它们,直到其他作业到达 我有以下代码: #include <iostream> #include <thread> #include <mutex> using namespace std; st

假设我们有两个工人。每个工人的id分别为
0
1
。另外,假设我们一直都有作业到达,每个作业也有一个标识符
0
1
,指定必须由哪个工人来完成此项工作

我想创建两个最初被锁定的线程,然后当两个作业到达时,解锁它们,每个作业都执行它们的作业,然后再次锁定它们,直到其他作业到达

我有以下代码:

  #include <iostream>
  #include <thread>
  #include <mutex>

  using namespace std;

  struct job{

      thread jobThread;
      mutex jobMutex;

  };

  job jobs[2];


  void executeJob(int worker){

      while(true){

          jobs[worker].jobMutex.lock();

          //do some job

      }

   }

  void initialize(){

      int i;
      for(i=0;i<2;i++){
                jobs[i].jobThread = thread(executeJob, i);
      }

   }

  int main(void){

      //initialization
      initialize();

      int buffer[2];
      int bufferSize = 0;

      while(true){
          //jobs arrive here constantly, 
            //once the buffer becomes full, 
            //we unlock the threads(workers) and they start working
          bufferSize = 2;
          if(bufferSize == 2){
              for(int i = 0; i<2; i++){
                  jobs[i].jobMutex.unlock();
              }
          }
           break;
     }

  }
#包括
#包括
#包括
使用名称空间std;
结构作业{
线程作业线程;
互斥工作互斥;
};
工作岗位[2];
void executeJob(内部工作者){
while(true){
作业[worker].jobMutex.lock();
//做些工作
}
}
void initialize(){
int i;
对于(i=0;iFrom:

在销毁互斥锁之前,所有成功锁定互斥锁的线程都必须解锁互斥锁。否则,行为未定义

让一个线程代表另一个线程解锁互斥锁的方法是不正确的


您尝试的行为通常会使用。如果您查看到成员函数的链接,就会看到一些示例。

为此,您可以使用boost的threadpool类。 这是一个高效且经过良好测试的开源库,而不是你新写并稳定它

注:

关于你的例子的建议: 您不需要为每个线程都有单独的互斥对象。单个互斥对象锁本身将在所有线程之间进行同步。您在executejob函数中锁定一个线程的互斥对象,而不解锁另一个线程则使用不同的互斥对象调用锁,从而导致死锁或未定义的行为

另外,由于您在whileloop中调用mutex.lock(),而没有解锁,所以同一线程正试图用同一个互斥对象在内部锁定自己,从而导致未定义的行为

如果不需要并行执行线程,可以在executejob函数中使用一个全局互斥对象来锁定和解锁

mutex m;

void executeJob(int worker)
{
    m.lock();

    //do some job

    m.unlock();
}

如果您想执行作业并行使用Boost THeLooCub,正如我之前建议的。

一般您可以编写类似于下面的算法。它与pTrices一起工作。我确信它也将与C++线程一起工作。

  • 创建线程并使其等待,例如,
    工作\u存在
  • 当工作到达时,您通知正在等待该条件变量的所有线程。然后在主线程中,您开始等待另一个条件变量
    work\u done
  • 在接收到
    work\u exists
    通知后,工作线程会醒来,从
    jobs[worker]
    中获取分配的工作,并执行该任务,然后在
    work\u done
    变量上发送通知,然后返回等待
    work\u exists
    条件变量
  • 当主线程收到
    work\u done
    通知时,它会检查所有线程是否都完成了。如果没有,它会一直等待,直到最后一个完成线程的通知到达

  • 你能给我举一个简单的例子吗?不幸的是,我在过去的一个小时里一直在搜索,找不到关于如何创建自己的线程池的明确参考,大多数实现都使用boost。其他建议也很好,但是我以前从未使用过boost库,也许我应该开始这样做。
    mutex m;
    
    void executeJob(int worker)
    {
        m.lock();
    
        //do some job
    
        m.unlock();
    }