우리는 두 명의 작업자가 있다고 가정합니다. 각 작업자의 신분은 0
및 1
입니다. 또한 우리는 항상 작업이 도착한다고 가정 할 때 각 작업에는 어떤 작업자가이 작업을 수행해야 하는지를 지정하는 식별자 0
또는 1
이 있습니다.(C/C++ Threads) : 작업을 듣고 동시에 실행하는 작업자 스레드 생성
초기에 잠긴 두 개의 스레드를 만들고 싶습니다. 두 개의 작업이 도착하면 잠금을 해제하고 각각의 작업을 수행 한 다음 다른 작업이 도착할 때까지 다시 잠급니다.
나는 다음과 같은 코드가 있습니다
#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
를 사용하기 시작하고 비주얼 스튜디오가 abort() has been called
말을 나에게 오류를 제공하는 이유하지만 난 모르겠어요. 나는 무언가가 빠진 것이 있다고 생각하지만 내 무지 때문에 나는 무엇을 알아낼 수 없다.
는 두 개의 스레드를 초기화 한 후, 두 개의 스레드가 자신의 일을 할 것입니다 두 개의 스레드를 해제 메인 함수 내부에서 그들에게
를 잠 그려면을 기대
이 경우에는 아무 것도 없음) 다시 잠기 게됩니다.
하지만 대신 오류가 발생합니다. 내가 도대체 뭘 잘못하고있는 겁니까?
미리 감사드립니다. cppreference's page on std::mutex::unlock
에서
이 간단한 예를 보여줄 수 있습니까? 불행히도 지난 시간을 찾고 있었고 내 스레드 풀을 만드는 방법에 대한 명확한 참조를 찾을 수 없었습니다. 대부분의 구현에서는 부스트를 사용합니다. 다른 제안들도 좋지만, 전에는 라이브러리를 향상시키지 않았습니다. 아마 그렇게해야 할 것 같습니다. – ksm001