2 人のワーカーがいるとします。各ワーカーには と の ID が0
あり1
ます。また、常にジョブが到着すると仮定します。各ジョブには、このジョブを実行する必要があるワーカーを指定する識別子0
もあります。1
最初はロックされている 2 つのスレッドを作成し、2 つのジョブが到着したらロックを解除し、それぞれのジョブを実行してから、他のジョブが到着するまで再度ロックします。
次のコードがあります。
#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
. 何かが足りないと思いますが、私の無知のため、何が足りないのかわかりません。
このコードが実際に
2 つのスレッドを初期化してからロックする
メイン関数内で 2 つのスレッドのロックを解除すると、2 つのスレッドはそれぞれの仕事を行い (この場合は何もしません)、その後再びロックされます。
しかし、代わりにエラーが発生します。私は何を間違っていますか?
前もって感謝します!