'동기화'에 해당되는 글 3건

  1. 2010.01.08 Semaphore 이용환 Download 완료 확인
  2. 2010.01.08 식사하는 철학자 동기화
  3. 2010.01.08 Reader / Writer 동기화

Semaphore 이용환 Download 완료 확인

CS/Common 2010. 1. 8. 07:10
원문 : Stanford iTunesU Programming Paradigm 17강

01int DownloadSingleFile(const char* server, const char* path);
02int DownloadAllFiles(const char* server, const char* files[], int n)
03{
04    int totalBytes = 0;
05 
06    Semaphore lock = 1;
07    Semaphore childrenDone = 0;
08 
09    for (int i=0; i < n; ++i)
10    {
11        ThreadNew("DownloadSingleFile", DownloadSingleFile, 4, server, files[i], &
12        totalBytes, lock, childrenDone);
13    }
14    for (int i=0; i < n; ++i)
15    {
16        // wait return.
17        SemaphoreWait(childrenDone);
18    }
19 
20    return totalBytes;
21}
22 
23void DownloadHelper(const char* server, const char* path,
24    int* returnButes, Semaphore lock, Semaphore parentToSignal)
25{
26    int bytesDownloaded = DownloadSingleFile(server, path);
27    SemaphoreWait(lock);
28    *numBytes += bytesDownloaded;
29    SemaphoreSignal(lock);
30    SemaphoreSignal(parentToSignal);
31}
:

식사하는 철학자 동기화

CS/Common 2010. 1. 8. 06:48
원문 : Stanford iTunesU Programming Paradigm 17강

01Semaphore forks[5] = {1, 1, 1, 1, 1}
02Semaphore numAllowedToEat(4); // 최소한 한명은 Idle. DeadLock 피함.
03 
04void Philosopher(int id)
05{
06    for (int i=0; i < 3; ++i)
07    {
08        Think();
09        SemaphoreWait( numAllowedToEat );
10        SemaphoreWait( forks[ id ] );
11        SemaphoreWait( forks[ (i+1)%5 ] );
12        Eat();
13        SemaphoreSignal( forks[ id ] );
14        SemaphoreSignal( forks[ (id+1)%5 ] );
15        SemaphoreSignal( numAllowedToEat );
16    }
17}

학부때 OS 시간에는 뭔가 엄청 복잡하고 어려웠는데... 왜이렇게 간단하지...? ;;;
:

Reader / Writer 동기화

CS/Common 2010. 1. 8. 05:45
원문 : Stanford iTunesU Programming Paradigm 16강

버퍼에서 Read 전에 Write 금지.
Write 되지 않은 버퍼 Read 하지 않기.
01char buffer[8];
02Semaphore emptyBuffers(8);
03Semaphore fullBuffers(0);
04 
05int main()
06{
07    ThreadNew("Writer", Writer, 0);
08    ThreadNew("Reader", Reader, 0);
09    RunAllThread();
10}
11 
12void Writer()
13{
14    for (int i=0; i < 40; ++i)
15    {
16        char c = PrepareRandomChar();
17        SemaphoreWait(emptyBuffers);
18        buffer[ i%f ] = c;
19        SemaphoreSignal(fullBuffers);
20    }
21}
22 
23void Reader()
24{
25    for (int i=0; i < 40; ++i)
26    {
27        SemaphoreWait(fullBuffers);
28        char c = buffer[ i%f ];
29        ProcessChar(c);
30        SemaphoreSignal(emptyBuffers);
31    }
32}
: