我试图实现一个涉及同步的真实模拟,当我有一个有80%发生几率的事件时,我现在正在做
-p PID
然而,while循环在运行时从不触发,所以我不确定我是否正确使用rand()。如果我用7替换rand(),当它正常工作时。我目前正在设置
while((rand()%10)<8){
up(sCar);
printf("SOUTH: new car\n");
}
在我的计划中也是如此。任何帮助将不胜感激。
编辑:这是完整运行的程序。我修改了sys.c来创建up和down的系统调用,它们充当Semaphores。
srand (time(NULL));
答案 0 :(得分:0)
我总是使用这个公式来获得有偏见的rand()。我相信这比模数方法的分布更均匀。
#define RAND_PCT_THRESHOLD(x) (int)(((long)(x) * RAND_MAX) / 100))
if (rand() < RAND_PCT_THRESHOLD(80))
{
// ...
)
你是什么意思
我修改了sys.c来创建up和down的系统调用, 充当信号量。
我认为这不是一个好主意。您确定没有比修改运行时库更简单,更安全的原子增量方法吗?你的错误可能来自那里,因为你发布的代码的逻辑确实看起来是正确的,如果你没有搞乱只读 - 除非那里有一个bug,它可能会运行正常-in-it 运行时库。
为您的信号量&#39;
分配内存时 void * ptr = mmap(NULL, sizeof(struct cs1550_sem)*3, PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, 0, 0);
当你明显需要4个信号量的空间时,你可以为3个信号量分配空间。
struct cs1550_sem *nCar = ((struct cs1550_sem *)ptr);
struct cs1550_sem *sCar = ((struct cs1550_sem *)ptr) + 1;
struct cs1550_sem *mutex = ((struct cs1550_sem *)ptr) + 2;
struct cs1550_sem *flag = ((struct cs1550_sem *)ptr) + 3;