2014-09-08 1 views
0

응용 프로그램의 성능 문제를 해결하기 위해 스레딩 및 세마포를 사용하려고합니다.세마포가 출시되는 즉시 시작되는 스레드 시작

문제 1 : 일부 체크 박스에

사용자를 클릭합니다. 체크 박스를 클릭 할 때마다 데이터베이스에서 다소 집중적 인 저장이 수행됩니다. 느린 사용자 불만 사항. 이제 체크 박스를 클릭하면 저장을 수행하는 스레드가 시작됩니다 (스레드가 완료 될 때까지 기다리지 않고). 그것은 잠시 동안 ok이었다.

문제 2 :

사용자가 빠르고 불운 때문에 동시에 데이터베이스 사고로 때로는 절약, 다른 스레드가 동일한 테이블에 저장하려고합니다. 그래서 우리가 여기에 필요한 것은 세마포어라고 생각합니다. 하지만 확실하지 않습니다..

내가 원하는 것은 이런 일이하는 것입니다

사용자 체크 박스 하나를 클릭 확인란이 실행 스레드 2 1 개 사용자 클릭이 (마무리 스레드 1 대기) 실행 스레드 스레드 1 마무리 스레드 2 마무리 여기

내 코드입니다 :이 기능은 우리가 스레드

를 시작하는 전화

그런 다음 913,210

(정적) 이전 함수에 의해 호출되는 함수

UINT SampleSO::ExecuteThreadSauvegarde(LPVOID pParam) 
{ 
    SampleSO* pSampleSO = (SampleSO*)pParam; 

    LONG dwSemCount; 
    HANDLE hSemaphore = OpenSemaphore(SYNCHRONIZE |SEMAPHORE_MODIFY_STATE, FALSE, _T("Sauvegarde")); 

    //this is the function that call the saving 
    pSampleSO->Sauvegarde(); 

    ReleaseSemaphore(hSemaphore, 1, &dwSemCount); 

    return 1; 
} 
임계 영역이 대기하는 스레드 시점에와 있다는 하나 개의 스레드 접근 만되도록 내 코드를 수정할 수있는 방법

세마포어가 출시 될 때마다 (한 번에 하나씩) 중요한 섹션으로 이동합니다.

감사합니다.

답변

2

필요한 스레드가 많지 않습니다. 대신 DB 작업을 처리 할 단일 작업자 스레드를 생성하십시오. 사용자가 클릭 할 때 대기열을 통해 작업자 스레드에 메시지/명령을 게시하기 만하면됩니다. 작업자는 단순히 명령을 기다리고 실행 한 다음 대기열에서 대기중인 차단으로 돌아갑니다. 큐 자체에 대한 스레드 안전 이외의 동기화는 필요하지 않습니다. 이는 단일 프로듀서, 단일 소비자이기 때문에 간단합니다.

+0

작업자 스레드의 작동 방식에 대한 샘플 코드가 있습니까? –

+0

기본적으로 'while (canRun) {doWork (queue.pop()); }'. Shutdown하고자 할 때 주 스레드에서'canRun' (휘발성 bool)을 false로 설정 한 다음 작업자 스레드를 join()하여 보류중인 항목이 모두 완료되도록 할 수 있습니다. –

+0

이 솔루션을 살펴볼 것입니다. (스레딩에 익숙하지 않아서 시간이 걸릴 수 있습니다). 효과가 있으면 이번 주말에 답을 좋은 것으로 표시 할 것입니다. –

관련 문제