-1

pthread_cond と pthread_mutex の代わりにセマフォを使用するこの小さなプログラムを作成しました。

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sema;

pthread_t threads[2];

pthread_cond_t cond;

pthread_mutex_t mutex;

int value;

void * worker_a();
void * worker_b();

int main() {
    value = 3;

    sem_init(&sema, 0, 0);

    pthread_create(&threads[1], NULL, worker_b, NULL);
    pthread_create(&threads[0], NULL, worker_a, NULL);

    pthread_join(threads[0], NULL);
    pthread_join(threads[1], NULL);

    pthread_detach(threads[0]);
    pthread_detach(threads[1]);

    sem_destroy(&sema);

    printf("Value has been set to: %d.\n", value);

    return 0;
}

/**
 * Multiplicates value by 4.
 */
void * worker_a() {
    value *= 4;

    sem_post(&sema);

    pthread_exit(NULL);
}

/**
 * Divides value by 2.
 */
void * worker_b() {
    sem_wait(&sema);

    value /= 2;

    sem_post(&sema);

    pthread_exit(NULL);
}

まず、この例は正しいですか?つまり、適切にコンパイルおよび実行されますが、これは単純なプログラムのせいかもしれません。

2 つ目: セマフォを使用することは、ミューテックス、条件変数、および多くの条件フラグを使用するよりもスマートな代替手段であることを正しく理解していますか?

ボードー

4

1 に答える 1

1

いいえ、コメントで明確にした目標(value最終的に6になること)を考えると、それは正しくありません。worker_aandの実行順序はworker_b保証されません。

セマフォの使用は、通常のミューテックスの使用と同じです。value同時操作から保護するだけで、順序付けは強制しません。セマフォを取得する前sleep(5)に to を投げると、私の言いたいことがわかるでしょう。worker_a

セマフォをzeroに初期化し、worker_aそれが完了したらポストするかもしれません。その後worker_b、適切なタイミングで目を覚まし、その仕事を行います。

// main
// ----
   sem_init(&sema, 0, 0);  // N.B. initial value is ZERO

// worker_a
// --------
   value *= 4;             // We know a priori that sema is zero and others will wait for it
   sem_post(&sema);        // Let worker_b proceed

// worker_b
// --------
   sem_wait(&sema);        // Pause until worker_a is done
   value /= 2;
   sem_post(&sema);
于 2013-05-30T14:50:25.310 に答える