此代码可以很好地演示关键部分问题,但我有两个关于代码的问题,
以下是代码:
#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;
}
答案 0 :(得分:1)
为了让某个帖子“被拒绝”进入,您必须替换sem_wait()
,这是sem_trywait()
或sem_timedwait()
的阻止通话,尽管他们可能永远不会进入关键部分(没有对代码进行一些修改)。但是,由于您只想查看线程何时被拒绝进入该部分,这应该足够了。 (有关这些方法的更多信息,请访问手册页http://linux.die.net/man/3/sem_wait)。
至于第二个问题,答案是你实际上不能立刻启动所有线程,它们必须以某种顺序启动。但是你可以(如果你愿意)启动多个线程并使用信号量来阻塞它们直到所有线程都准备就绪,然后立即释放它们,这就像你可以立即启动它们一样。