2016-12-14 7 views
1

私はCの新機能ですが、このコードはPachecoの本 "Introduction to Parallel Programming"を実行しようとしています。そして、私はどのようにセマフォの初期化をmain()に実装すべきかを理解できません。 &semaphores[dest]&semaphores[my_rank]はアレイですか?Cでセマフォを使用してスレッドの順序を制御する

Cコード:

/* messages is allocated and initialized to NULL in main */ 
/* semaphores is allocated and initialized to 0 (locked) in main */ 
void *Send_msg(void* rank) { 
    long my_rank = (long) rank; 
    long dest = (my_rank + 1) % thread_count; 
    char* my_msg = (char*)malloc(MSG_MAX*sizeof(char)); 

    sprintf(my_msg, "Hello to %ld from %ld", dest, my_rank); 
    messages[dest] = my_msg; 
    sem_post(&semaphores[dest]) 
    /* ‘‘Unlock’’ the semaphore of dest */ 

    sem_wait(&semaphores[my_rank]);/* Wait for our semaphore to be unlocked */ 
    printf("Thread %ld > %s\n", my_rank, messages[my_rank]); 

    return NULL; 
} /* Send_msg */ 

私は、ファイルへの出力配列を記述しようとしていますと、注文このタイプのメカニズムを実装したいです。

int k = 0; 
long dest = (my_rank + 1) % THREAD_COUNT; 

if(genCount%50==0){ 
//incrementing file name 

//semapthore lock 
sem_post(&semaphores[dest]); 

sem_wait(&semaphores[my_rank]); 

snprintf(buffer, sizeof(char) * 32, "file%i.dat", k); 

//open the file 
fp = fopen(buffer, "r+"); 
if (fp == NULL) { 
    printf("I couldn't open file for writing.\n"); 
    exit(0); 
} 

int loop1, loop2; 

//outputting the array into the file 
for (loop1 = my_first_i; loop1 < my_last_i; loop1++){ 
    for(loop2 = my_first_i; loop2 < my_last_i; loop2++){ 
fprintf(fp,"%d\t", map[loop1][loop2]); 
    } 
} 

//close the file 
fclose(fp); 

k++; 

}

main()でsemaphorsの初期化:ここに私のコードです

#define THREAD_COUNT 4 
sem_t semaphores[THREAD_COUNT]; 

プログラム:

int semCount; 
    for(semCount = 0; semCount < THREAD_COUNT; semCount++){ 
    sem_init(&semaphores[semCount], 0, 1); 
    } 

私はまた、グローバル変数としてそれを持っていますコンパイルすると、このエラーが表示されます:

 *** Error in `./ebola_serial': double free or corruption (out): 0x00007f49700008c0 *** 
    *** Error in `======= Backtrace: ========= 
    /lib64/libc.so.6(+0x7238e)[0x7f49868f038e] 
    ./ebola_serial/lib64/libc.so.6(+0x7a0c8)[0x7f49868f80c8] 
    ': /lib64/libc.so.6(cfree+0x48)[0x7f49868fb798] 
    double free or corruption (out)/lib64/libc.so.6(fclose+0x113)[0x7f49868e6473] 
    ./ebola_serial[0x401717] 
    /lib64/libpthread.so.0(+0x75bd)[0x7f4986c395bd] 
    : 0x/lib64/libc.so.6(clone+0x6d)[0x7f498697562d] 
    ======= Memory map: ======== 
    00007f49700008c000400000-00402000 r-xp 00000000 08:01 802698        /home/name/Desktop/try ca/ebola_serial 
    00601000-00602000 r--p 00001000 08:01 802698        /home/name/Desktop/try ca/ebola_serial 
    00602000-00603000 rw-p 00002000 08:01 802698        /home/name/Desktop/try ca/ebola_serial 
    00603000-009d3000 rw-p 00000000 00:00 0 
    01b96000-01bb7000 rw-p 00000000 00:00 0         [heap] 
    7f4970000000-7f4970021000 rw-p 00000000 00:00 0 
    7f4970021000-7f4974000000 ---p 00000000 00:00 0 
    7f4978000000-7f4978021000 rw-p 00000000 00:00 0 
    7f4978021000-7f497c000000 ---p 00000000 00:00 0 
    7f497c000000-7f497c021000 rw-p 00000000 00:00 0 
    7f497c021000-7f4980000000 ---p 00000000 00:00 0 
    7f4980000000-7f4980021000 rw-p 00000000 00:00 0 
    7f4980021000-7f4984000000 ---p 00000000 00:00 0 
    7f4984663000-7f4984679000 r-xp 00000000 08:01 131531      /usr/lib64/libgcc_s-4.9.2.so.1 
    7f4984679000-7f4984878000 ---p 00016000 08:01 131531      /usr/lib64/libgcc_s-4.9.2.so.1 
    7f4984878000-7f4984879000 r--p 00015000 08:01 131531      /usr/lib64/libgcc_s-4.9.2.so.1 
    7f4984879000-7f498487a000 rw-p 00016000 08:01 131531      /usr/lib64/libgcc_s-4.9.2.so.1 
    7f498487a000-7f498487b000 ---p 00000000 00:00 0 
    7f498487b000-7f498507b000 rw-p 00000000 00:00 0       [stack:7376] 
    7f498507b000-7f498507c000 ---p 00000000 00:00 0 
    7f498507c000-7f498587c000 rw-p 00000000 00:00 0 
    7f498587c000-7f498587d000 ---p 00000000 00:00 0 
    7f498587d000-7f498607d000 rw-p 00000000 00:00 0       [stack:7374] 
    7f498607d000-7f498607e000 ---p 00000000 00:00 0 
    7f498607e000-7f498687e000 rw-p 00000000 00:00 0       [stack:7373] 
    7f498687e000-7f4986a28000 r-xp 00000000 08:01 130947      /usr/lib64/libc-2.20.so 
    7f4986a28000-7f4986c28000 ---p 001aa000 08:01 130947      /usr/lib64/libc-2.20.so 
    7f4986c28000-7f4986c2c000 r--p 001aa000 08:01 130947      /usr/lib64/libc-2.20.so 
    7f4986c2c000-7f4986c2e000 rw-p 001ae000 08:01 130947      /usr/lib64/libc-2.20.so 
    7f4986c2e000-7f4986c32000 rw-p 00000000 00:00 0 
    7f4986c32000-7f4986c49000 r-xp 00000000 08:01 130973      /usr/lib64/libpthread-2.20.so 
    7f4986c49000-7f4986e48000 ---p 00017000 08:01 130973      /usr/lib64/libpthread-2.20.so 
    7f4986e48000-7f4986e49000 r--p 00016000 08:01 130973      /usr/lib64/libpthread-2.20.so 
    7f4986e49000-7f4986e4a000 rw-p 00017000 08:01 130973      /usr/lib64/libpthread-2.20.so 
    7f4986e4a000-7f4986e4e000 rw-p 00000000 00:00 0 
    7f4986e4e000-7f4986f53000 r-xp 00000000 08:01 130955      /usr/lib64/libm-2.20.so 
    7f4986f53000-7f4987152000 ---p 00105000 08:01 130955      /usr/lib64/libm-2.20.so 
    7f4987152000-7f4987153000 r--p 00104000 08:01 130955      /usr/lib64/libm-2.20.so 
    7f4987153000-7f4987154000 rw-p 00105000 08:01 130955      /usr/lib64/libm-2.20.so 
    7f4987154000-7f4987174000 r-xp 00000000 08:01 130940      /usr/lib64/ld-2.20.so 
    7f4987353000-7f4987356000 rw-p 00000000 00:00 0 
    7f498736d000-7f4987373000 rw-p 00000000 00:00 0 
    7f4987373000-7f4987374000 r--p 0001f000 08:01 130940      /usr/lib64/ld-2.20.so 
    7f4987374000-7f4987376000 rw-p 00020000 08:01 130940      /usr/lib64/ld-2.20.so 
    7ffce31e3000-7ffce3205000 rw-p 00000000 00:00 0       [stack] 
    7ffce320d000-7ffce320f000 r--p 00000000 00:00 0       [vvar] 
    7ffce320f000-7ffce3211000 r-xp 00000000 00:00 0       [vdso] 
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0     [vsyscall] 
    Aborted 

ご協力いただければ幸いです。

+0

'man sem_init'を読んで、さらに質問してください。 – user902384

+2

それはどんな種類のCですか? '/'は '/'と '_'がなくなっているようです...とにかく' [] 'はあなたの質問に答えるための配列添字演算子です。 –

+1

一部の電子書籍またはスキャンからの不正なコピーです。あなたはロッククォートを気付いていますか?それらはモノスペースフォントの引用符ではなく、引用符を印刷しています。アンダースコアがありません。 OCRには失敗実装があります。 – user902384

答えて

1

この方法Nを使用して、所望のセマフォへのポインタを取るsem_init関数を使用する必要がセマフォを初期化するためのセマフォ

の数、共有プロセスを可能にするフラグである

sem_t semaphores[N]; 

定義セマフォのように見えますセマフォの使用法と初期値。あなたはsem_waitとsem_post関数を呼び出すためにあなたが持っているセマフォを使用するための

int i; 
for(i=0;i<N;i++) 
    sem_init(&semaphores[i], 0, 1); 

フィンレイを初期化するために、アレイのすべてのメンバーに反復処理する必要がありますので

sem_init(&semaphores[0], 0, 1); 

は、あなたのケースでは、アレイに保存されているセマフォのインスタンスは、セマフォと呼ばれますこのように

sem_wait(&semaphores[0 to N-1]); // Locking semaphore 
sem_post(&semaphores[0 to N-1]); // Unlocking it 
+0

オハイオ州、大丈夫です。つまり、スレッドごとに1つのセマフォを持つべきですか? –

+1

セマフォはクリティカルセクションのデータを保護するために使用されます。たとえば、プロデューサ - コンシューマの問題、1つのスレッドでデータが生成され、コンシューマスレッドが消費しているとします。時間!それは一貫性を損なうか、または生産者 - 消費者の操作を邪魔する可能性があります –

+1

したがって、セマフォなどでデータを保護する必要があります。 クリティカルセクション(2つのスレッド間の共有データ)にアクセスする前にセマフォーロックを設定し、作業を終了したときにロックを解除することができます。セマフォがロックされると、他のロックは置かれません。 実際には、最初のロッカースレッドは動作し続け、2番目のロッカースレッドは、最初のロッカースレッドが終了してセマフォーをロック解除するまでブロックされます。 2つのスレッドが同じセマフォをロックする必要があることに注意してください。 –

関連する問題