0

这段代码很好地展示了关键部分问题,但我有两个关于代码的问题,

  1. 如何显示哪个线程被拒绝进入关键部分?
  2. 线程“A”、“B”、“C”按列出的顺序创建。我怎样才能一次启动它们?

这是代码:

#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;
}
4

1 回答 1

1

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

至于第二个问题,答案是您实际上不能一次启动所有线程,它们必须以某种顺序启动。但是,您可以(如果需要)启动多个线程并使用信号量来阻止它们,直到所有线程都准备好然后立即释放它们,这与您可以立即启动它们一样接近。

于 2013-10-16T19:05:39.467 回答