2013-05-16 5 views
2

현재 현재 실행중인 스레드를 최대 크기로 제한하려고합니다. 핵심 금액.C++ 세마포어가 호출 순서를 고려하지 않습니다.

이것은 모두 잘되고 있으며, 초당 100 건의 전체 데이터 쓰기 (열기, 추가, 닫기)와 비슷하지만 뮤텍스 (양> 1)를 사용하지 않는 세마포어는 순서 또는 쓰기 액세스가 찌르다. 사용

A의 루프 : writeasnewthread threadwrite는 새로운 스레드 PARAM 함유 이름 데이터 및 세마포어

WaitForSingleObject(this->semaphor,INFINITE); 
    CreateThread(NULL,0,&threadwrite,(void*)param,0,NULL); 

포함

for(int i=0;i<10;i++) 
      mywrite.writeasnewthread("test.txt","asd"+mywrite.tostring(i)); 

. 내가 threadwrite에 쓴 파일을 볼 때 가 그런 말 threadwrite에 나는, 그러나

ReleaseSemaphore(writeparam->This->semaphor,1,NULL); 

전화,

2013-5-16 14:41:25 asd0 
2013-5-16 14:41:25 asd3 
2013-5-16 14:41:25 asd5 
2013-5-16 14:41:25 asd7 
2013-5-16 14:41:25 asd1 
2013-5-16 14:41:25 asd8 
2013-5-16 14:41:25 asd9 
2013-5-16 14:41:25 asd6 
2013-5-16 14:41:25 asd4 
2013-5-16 14:41:25 asd2 

등에 뭔가를 간다 아마 방법 세마포어 작품 몇 가지 기본적인 오해가 ,하지만 그 스레드는 세마포어가 다시 빈 슬롯을 가지기를 기다리고있을 것이지만 작업을 시작합니다 ...

그래서 파일의 순서를 유지하는 좋은 방법이 있습니까? 또는 이것이 세마포어의 개념을 파괴합니까?

감사합니다, 줄리안

+0

제쳐두고 (로버트의 대답은 정확합니다), 무엇을 사용합니까? 쓰기가 엄격한 순서로 실행되면 아무런 동시성을 얻지 못할 것입니다! – Useless

+1

@Useless 글쎄, 스레드를 사용하는 프로세서를 더 잘 활용할 계획 이었지만, 지금은 뮤텍스로 충분할 것이라고 생각합니다. 따라서 IO를 처리하는 추가 스레드, 다른 것으로 바쁜 주 스레드 및 뮤텍스가 있는지 확인하기위한 스레드가 있다고 생각합니다. 많은 데이터를 저장할 때 경쟁 조건이 없어도 충분합니다. – Julian

+0

솔직히 말해서,이 글은 너무 작기 때문에 다른 스레드에서 동기화 작업을 수행하는 것보다 비용이 적게 듭니다. – Useless

답변

5

음, 간단한 대답은 no입니다. OS는 스레드가 원하는 순서대로 실행되도록 예약 할 수 있으며 사용자가 작성한 순서대로 실행되지 않을 가능성이 높습니다.

4

세마포어는 세마포어를 보유하고있는 다양한 스레드간에 관계를 부과하지 않습니다. 한 번에 성공적으로 세마포어를 획득 할 수있는 엔티티의 수만을 제한합니다.

스레드 스케줄링과 관련이있는 세마포어 정의에는 아무 것도 없습니다. 예제에서 세마포어는 올바르게 작동합니다.

파일의 특정 순서로 쓰기를 원하면 스레드를 사용하는 이유는 무엇입니까? 기본 스레드의 쓰기 작업을 원하는 순서대로 수행하면 모든 것이 정상적으로 처리됩니다.

스레드는 정의되지 않은 순서로 작업하기를 원할 때 사용하기위한 것입니다. 뮤텍스, 세마포어, FIFO 및 기타를 사용하여 스레드간에 순서를 지정할 수 있지만 엄격한 연산 순서를 원한다면 스레드를 사용하지 않아야합니다.

관련 문제