如何通过使用信号量显示哪个线程被拒绝进入临界区

时间:2013-10-16 18:43:10

标签: multithreading semaphore

此代码可以很好地演示关键部分问题,但我有两个关于代码的问题,

  1. 如何显示哪条线被拒绝进入关键部分?
  2. 线程'A','B','C'按列出的顺序创建。我怎样才能一次性启动它们?
  3. 以下是代码:

    #include <pthread.h>
    #include <semaphore.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    void *doSomething1();
    void *doSomething2();
    void *doSomething3();
    
    sem_t sem;
    
    int main() {
        // initialize semaphore to 2
        sem_init(&sem, 1, 2);
    
        pthread_t thread1, thread2, thread3;
    
        pthread_create(&thread1, NULL, &doSomething1, NULL);
        pthread_create(&thread2, NULL, &doSomething2, NULL);
        pthread_create(&thread3, NULL, &doSomething3, NULL);
    
        pthread_join(thread1, NULL);
        pthread_join(thread2, NULL);
        pthread_join(thread3, NULL);
    
        return 0;
    }
    
    void doSomething(char c) {
        int i, time;
        for (i = 0; i < 3; i++) {
            if (sem_wait(&sem) == 0) {
                // generate random amount of time (< 7 seconds)
                time = (int) ((double) rand() / RAND_MAX * 7 );
                printf("#thread %c GOT-ACCESS to CRITICAL SESSION for %d sec\n", c, time);
                sleep(time);
                printf("\t->thread %c RELEASED CRITICAL SESSION\n",c);
                sem_post(&sem);
            }
        else    
            printf("thread %c FAILED TO ENTER CRITICAL SECTION",c);
        }
    }
    
    void *doSomething1() {
        // thread A
        doSomething('A');    return 0;
    }
    
    void *doSomething2() {
        // thread B
        doSomething('B');    return 0;
    }
    
    void *doSomething3() {
        // thread C
        doSomething('C');    return 0;
    }
    

1 个答案:

答案 0 :(得分:1)

为了让某个帖子“被拒绝”进入,您必须替换sem_wait(),这是sem_trywait()sem_timedwait()的阻止通话,尽管他们可能永远不会进入关键部分(没有对代码进行一些修改)。但是,由于您只想查看线程何时被拒绝进入该部分,这应该足够了。 (有关这些方法的更多信息,请访问手册页http://linux.die.net/man/3/sem_wait)。

至于第二个问题,答案是你实际上不能立刻启动所有线程,它们必须以某种顺序启动。但是你可以(如果你愿意)启动多个线程并使用信号量来阻塞它们直到所有线程都准备就绪,然后立即释放它们,这就像你可以立即启动它们一样。