단일 파일에 쓰고 다중 스레드 환경에서 작업 할 수있는 라이브러리를 작성하려고합니다. 요구 사항은 다음과 같습니다.다중 스레드 작성기 : cpp를 사용하는 동시성 문제
- 파일에 쓰는 동안 동시성 문제가 발생하지 않습니다.
- 스레드를 처리하는 순서는 중요하지 않습니다.
- 라이브러리는 차단되지 않아야합니다. 즉, 지정된 버퍼가 작성되기 전에 쓰기 및 플러시 함수가 반환됩니다.
가 여기에 지금까지이 작업은 다음과 같습니다
int write2device(char *buffer, int length) {
Task * task = new Task(id++,buffer,length);
pthread_t * thread = new pthread_t;
Argument * arg = new Argument; //A sturct with pthread_t and task fields
arg->task = task;
arg->thread = thread;
pthread_create(thread,NULL,deamonWrite,arg);
return 0;
}
void wait(Argument * arg) {
//manager is a singleton class that handles the threads database and related
//issues
manager->pushDeamon(arg->thread);
manager->lock(arg->task->getId()); //mutex - only one thread can write
}
void * deamonWrite(void * arg) {
Argument * temp = (Argument *) arg;
wait(temp);
//critical section
//will add signal() later
return NULL;
}
아이디어는 모든 스레드 호출 write2device을 위해 내가 deamonWrite를 실행하는 스레드를 열 수 있다는 점이다(). 이 함수는 wait() -> critical section -> signal()의 구조를가집니다. 기다리는 중, 다른 누군가가 글 쓰는 중이라면 (아직 완료하지 않았 음) 쓰레드가 일시 중지되어 쓰기가 완료 될 때까지 기다리지 않아도됩니다.
- 어떻게 뮤텍스 (기능 잠금)을 구현합니까 :
나는이 개 질문이? 나는 이것이 원자 함수이어야 함을 이해한다. 잠금을 얻으려고 시도하는 여러 스레드가 혼돈을 초래할지도 모른다는 것을 이해해야한다.
- 제 일반적인 구조가 올바른가요?
나는 동시성이 처음이라이 문제에 대한 어떤 생각이라도 고맙게 생각합니다. - 감사합니다!
사용하는 언어 (해당되는 C 또는 C++)에 해당하는 태그를 추가해야합니다. 더 많은 의견을 끌어 들이기 => 더 많은 답변. – assylias
'Task' 구조를 대기열/벡터로 푸시하고 각 작업마다 여러 스레드 대신 하나의 스레드에서 순차적으로 처리하는 것이 좋습니다. 뮤텍스가 필요한 유일한 곳은 대기열로 밀 때입니다. – irobot
@IRobot, 그 대답은 – Ben