假设我们有两个工作者。每名工人的编号为0
和1
。另外假设我们有工作一直到达,每个工作也有一个标识符0
或1
,它指定哪个工作人员必须完成这项工作。(C/C++线程):创建将侦听作业并在需要时并发执行它们的工作线程
我想创建两个最初被锁定的线程,然后当两个工作到达时解锁它们,每个工作完成他们的工作,然后再次锁定它们直到其他工作到达。
我有以下代码:
#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::thread
前几天,我不知道为什么,但Visual Studio中给了我一个错误说abort() has been called
。我相信有些东西因为我的无知而丢失,我无法弄清楚是什么。
我希望这段代码实际上
初始化两个线程,然后把它们锁
里面的主要功能解锁两个线程,这两个线程会做他们的工作(在这种情况下没有),然后他们会再次被锁定。
但它给我一个错误,而不是。我究竟做错了什么?
预先感谢您!
你能告诉我一个简单的例子吗?不幸的是,我一直在寻找过去的一小时,并找不到如何创建自己的线程池的明确参考,大多数实现使用boost。其他建议也很好,但是我之前没有使用boost库,也许我应该开始这样做。 – ksm001