- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 C 中的信号量来解决哲学家就餐问题。下面是我的代码。在代码中,每根筷子都由一个信号量表示。每个哲学家都是一个过程。我使用的概念是在任何给定时间最多可以有 4 根筷子处于“拿起”状态,以避免死锁。这就是为什么我将 dt 设置为 4。请告诉我下面的代码是否正确以及逻辑是否合理
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
#include <signal.h>
#include <sys/wait.h>
#include <time.h>
#include <semaphore.h>
#define STACKSIZE 10000
#define NUMPROCS 5
#define ROUNDS 10
sem_t dt,c1,c2,c3,c4,c5;
int child (void * philNum) {
int* phil1 = (int *)philNum;
int phil = *phil1;
int i = 0 ;
for ( ; i < ROUNDS ; i ++ ) {
switch(phil){
case 1:
sem_wait(&dt);
sem_wait(&c1);
sem_wait(&c5);
case 2:
sem_wait(&dt);
sem_wait(&c1);
sem_wait(&c2);
case 3:
sem_wait(&dt);
sem_wait(&c3);
sem_wait(&c2);
case 4:
sem_wait(&dt);
sem_wait(&c4);
sem_wait(&c3);
case 5:
sem_wait(&dt);
sem_wait(&c4);
sem_wait(&c5);
default:
perror(NULL);
exit(1);
}
// Start of critical section --
int sleeptime = rand()%20000 ;
if ( sleeptime > 10000 ) usleep(sleeptime) ;
// exit protocol here
switch(phil){
case 1:
sem_post(&dt);
sem_post(&c1);
sem_post(&c5);
case 2:
sem_post(&dt);
sem_post(&c1);
sem_post(&c2);
case 3:
sem_post(&dt);
sem_post(&c3);
sem_post(&c2);
case 4:
sem_post(&dt);
sem_post(&c4);
sem_post(&c3);
case 5:
sem_post(&dt);
sem_post(&c4);
sem_post(&c5);
default:
perror(NULL);
exit(1);
}
}
return 0 ;
}
int main ( int argc, char ** argv ) {
int i, num ;
int *pt= (int *)malloc(sizeof(int));
void * p ;
srand(time(NULL));
sem_init(&c1,1,1);
sem_init(&c2,1,1);
sem_init(&c3,1,1);
sem_init(&c4,1,1);
sem_init(&c5,1,1);
sem_init(&dt,1,4); //only 4 chopsticks can be picked up at a time. 5th one has to wait anyways as he cant eat with one chopstick
for ( i = 0 ; i < NUMPROCS ; i ++ ) {
p = malloc(STACKSIZE) ;
if ( p == NULL ) {
printf("Error allocating memory\n") ;
exit(1) ;
}
*pt = i+1;
int c = clone(child,p+STACKSIZE-1,CLONE_VM|SIGCHLD,(void *)pt,NULL) ;
if ( c < 0 ) {
perror(NULL) ;
exit(1) ;
}
}
for ( ; i > 0 ; i -- ) wait(NULL) ;
return 0 ;
}
最佳答案
你的案子失败了。
关于c - 使用信号量解决哲学家就餐僵局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5202432/
我正在使用 channel 在 Go 中构建一个异步 Btree,但我收到错误 fatal error: all goroutines are asleep - deadlock! 我不知道为什么因为
我正在尝试从字符串线程中明智地读取单词。意味着一个线程读一个单词,当所有单词完成后,所有线程也应该和平退出。在此示例中,字符串中有11个单词,并且有4个线程对该字符串进行操作。但是该程序在运行时被挂起
当我期望 Alpha 表现得像 Beta 时,为什么它会提前停止? Alpha 和 Beta 之间的唯一区别是 >! 和 put!,如下所述。 阿尔法: user=> (def q (chan)) #
当我期望 Alpha 表现得像 Beta 时,为什么它会提前停止? Alpha 和 Beta 之间的唯一区别是 >! 和 put!,如下所述。 阿尔法: user=> (def q (chan)) #
我想使用 C# 自动化第三方 Windows 命令行程序。通常,它是一个交互式控制台,您发送命令,它可能会提示详细信息,发回结果并显示提示以询问更多命令。通常: c:\>console_access.
似乎“复杂”(getC)功能被阻止了。我假设 channel 一旦被读取就会被销毁,因此我想知道如何与 getC 函数和 main 共享 sC channel 函数不会陷入死锁(current sni
我想编写三个相互发送整数的并发 go 例程。现在,我的代码已正确编译,但在第一次执行后出现错误“抛出:所有 goroutines 都睡着了 - 死锁!”。我试图找到错误,但我无法在代码逻辑中找到任何错
这是我的代码,我哪里出错了? func main() { intChan := make(chan int) wg := sync.WaitGroup{} for i := 0;i<5;i
package main import ( "fmt" "runtime" "sync" "time" ) func main() { intInputChan
我是一名优秀的程序员,十分优秀!