gpt4 book ai didi

c - 信号量问题,不要等待

转载 作者:行者123 更新时间:2023-11-30 18:03:49 24 4
gpt4 key购买 nike

我有一个关于信号量的问题,我想你可以帮助我..好吧,首先让我展示一下我在做什么。我必须使用 C 程序、一台服务器和其他指定的客户端。

在服务器上我这样做:

#ifdef _SEM_SEMUN_UNDEFINED    //here I define semun, in case that is not defined
#undef _SEM_SEMUN_UNDEFINED
union semun {
int val;
struct semid_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
#endif

union semun semopts;
int semID;

semID = semget(1000, 1, 0600 | IPC_CREAT | IPC_EXCL); //I want this gives error, if there is already a sem on that key
if(semID < 0){
perror(semID);
exit(1);
}
semopts.val = 10;
semctl(semID, 0, SETVAL, semopts); //Here I set the val for the first sem of the group, I want it with value 10

好吧,这是我的服务器文件,现在在客户端,我需要做的是:

10 个客户端可以同时从内存中读取数据,因此对于每个读取器,我在 sem 上执行 -1。1 个客户端可以同时在内存上写入,但没有人可以读取,所以在这种情况下,我对 sem 执行 -10,对吗??

这是我的客户端程序:

struct sembuf UP10 = {0, 10, 0};
struct sembuf DOWN10 = {0, -10, 0};
struct sembuf UP1 = {0, 1, 0};
struct sembuf DOWN1 = {0, -1, 0};
int semID;
semID = semget(1000, 1, 0600 | IPC_CREAT);
if(semID < 0){
perror(semID);
exit(1);
}

//Okay now its here on my switch where they read or write

switch(selection[0]){ //This store the number from a scanf
case '1':

semop(semID, &DOWN1, 1);
functionToRead(..);
semop(semID, &UP1, 1);
break;

case '2': //Here the client also read from memory

semop(semID, &DOWN1, 1);
functionToReadAlsoMemory(...);
semop(semID, &UP1, 1);
break;

case '3': //Here is the block where the client WRITES on memory so use the struct DOWN10 and UP10

semop(semID, &DOWN10, 1);
functionToWriteOnMemory(...);
semop(semID, &UP10, 1);
break;

}

好的,问题是:

当我按3(阻止写入内存)时,程序对sem执行-10,并在该函数上输入,有scanf,因此sem将具有0,直到它退出该函数..当用户按回车键时并通过 scanf。在这种情况下,如果客户端正在写入,并且我尝试打开另一个客户端并写入,它会一直等待,直到另一个客户端离开该功能并执行 sem UP10。好的,这很好,这就是我想要的,然后正在等待的客户端通过该函数来编写..好的好

但是,如果一个客户端使用该函数(该客户端执行了 DOWN10,因此 sem 0),并且我尝试从内存中读取(在情况“1”或情况“2”上),他实际上可以!但不应该!!因为如果sem仍然是0,他就不能让sem DOWN1,对吗?

我想你们在这里理解了我的问题,我有 sem 之类的包含器,问题不存在,对吗?因为它适用于 2 个尝试编写的客户端..

如果你们能找出我的问题出在哪里,那就太好了:s预先非常感谢,干杯!!

最佳答案

信号量是一个困难的工具,对于正常的用户空间代码来说太低级了。请考虑改用 POSIX 的控制结构 pthread_mutex_tpthread_cond_t。如今,它们可以轻松地在进程之间的共享内存中使用。

信号量的主要问题之一是调用可能会被任何类型的信号中断,特别是当 IO 传递到您的进程时。您必须捕获调用提供的返回值和错误代码,然后再次等待。

关于c - 信号量问题,不要等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8027031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com