5

したがって、セマフォとsembufで設定さ semidれたセマフォがある場合num_of_sems *deleter_searchers_down

struct sembuf *deleter_searchers_down 
                        = malloc(sizeof (*deleter_searchers_down) * num_of_sems);
for (i = 0; i < num_of_sems; ++i) {
            (deleter_searchers_down + i)->sem_op = -1;
            (deleter_searchers_down + i)->sem_num = i;
            (deleter_searchers_down + i)->sem_flg = SEM_UNDO;
        }
semop(semid, deleter_searchers_down, num_of_sems);

semop の呼び出しは、セット内のすべてのセマフォを一度に下げようとしますか、それとも、0 である最初のセマフォを下げようとするとブロックし、他のプロセスがその特定のセマフォを上げた後に続行しますか?

4

1 に答える 1

6

すべての更新が 1 つの単位として進行できるようになるまで、更新は行われません。

semopPOSIX仕様は、この点についてより明確である可能性がありますが、それはアトミックであると言っています.

Linux ではsemop(3)、glibc は .xml の単純なラッパーsemop(2)です。semop(2)マンページには次のように書かれています

に含まれる操作のセットは、配列の順序sopsで実行され、アトミックに実行されます。つまり、操作は完全な単位として実行されるか、まったく実行されません。

HP-UXsemop(2)マンページはさらに明確です。

セマフォ配列操作は、配列内のすべてのセマフォのブロッキング条件が削除されるまで、セマフォ操作が実行されないという点でアトミックです。

于 2012-04-18T10:09:28.343 に答える