2012-05-05 3 views
0

단일 파일에 쓰고 다중 스레드 환경에서 작업 할 수있는 라이브러리를 작성하려고합니다. 요구 사항은 다음과 같습니다.다중 스레드 작성기 : cpp를 사용하는 동시성 문제

  1. 파일에 쓰는 동안 동시성 문제가 발생하지 않습니다.
  2. 스레드를 처리하는 순서는 중요하지 않습니다.
  3. 라이브러리는 차단되지 않아야합니다. 즉, 지정된 버퍼가 작성되기 전에 쓰기 및 플러시 함수가 반환됩니다.

가 여기에 지금까지이 작업은 다음과 같습니다

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()의 구조를가집니다. 기다리는 중, 다른 누군가가 글 쓰는 중이라면 (아직 완료하지 않았 음) 쓰레드가 일시 중지되어 쓰기가 완료 될 때까지 기다리지 않아도됩니다.

  1. 어떻게 뮤텍스 (기능 잠금)을 구현합니까 :

    나는이 개 질문이? 나는 이것이 원자 함수이어야 함을 이해한다. 잠금을 얻으려고 시도하는 여러 스레드가 혼돈을 초래할지도 모른다는 것을 이해해야한다.

  2. 제 일반적인 구조가 올바른가요?

나는 동시성이 처음이라이 문제에 대한 어떤 생각이라도 고맙게 생각합니다. - 감사합니다!

+1

사용하는 언어 (해당되는 C 또는 C++)에 해당하는 태그를 추가해야합니다. 더 많은 의견을 끌어 들이기 => 더 많은 답변. – assylias

+3

'Task' 구조를 대기열/벡터로 푸시하고 각 작업마다 여러 스레드 대신 하나의 스레드에서 순차적으로 처리하는 것이 좋습니다. 뮤텍스가 필요한 유일한 곳은 대기열로 밀 때입니다. – irobot

+0

@IRobot, 그 대답은 – Ben

답변

4

Task 구조를 대기열/벡터로 밀어 넣고 각 작업마다 여러 스레드 대신 단일 스레드에서 순차적으로 처리하십시오. 뮤텍스가 필요한 유일한 곳은 대기열을 밀고 당기는 것입니다. Ben이 주석에서 올바르게 언급했듯이, 쓰레드 동기화 프리미티브 (mutex, critical section)의 구현을 OS 및/또는 사용이 허가 된 시스템 API로 남겨 두어야합니다.

+1

정확한 접근법, 지금까지. 모든 글에 대한 새로운 쓰레드를 만드는 것은 그것이 나쁜 것이 아닌가하는 생각입니다. 어딘가에 '쓰레드를 사용하려면, 데이터를 매개 변수로 만들어서 실행 시켜서 돌려 보내서 종료시켜야합니다. 보너스 표시의 경우 'join'을 사용하여 앱에 더 많은 오버 헤드를 추가하십시오. 누군가이 교과서를 모두 모아서 태우고 가급적이면 그들과 묶인 저자들과 함께 스테이크 주변에 쌓여있게 될까요? –