Tag: 信号量

互斥和信号量实际上做了什么?

我想要一些关于互斥和信号量的澄清。 我的问题是, 当线程试图进入由互斥锁锁定的区域时,互斥锁实际上做了什么。 它等待锁被释放? 或b。 它进入睡眠状态,直到释放锁定。 在那种情况下,如何在释放锁定时再次唤醒? 与1相同的问题,但在这种情况下它是信号量。 你能给我一些关于C中pthread中忙碌等待的代码,还有线程进入hibernate而不是等待的情况? 睡觉意味着它是阻塞还是睡觉是另一种忙碌的等待? 我想知道一些涵盖这种情况的程序,例如一些c源代码,其中实现繁忙等待,阻塞等。

使用信号量的未定义参考问题

我正在使用信号量,但我一直遇到未定义的参考警告,从而导致我的代码无法工作。 我从文本中提取了示例代码,但是他们的一些语法出现了问题,所以我去了POSIX的信号量教程并将其改为语法,因此我现在得到了这些参考错误。 我可能只是忽略了一些东西,但我找不到它。 错误: Producers_Consumers.c:52: warning: return type of ‘main’ is not ‘int’ /tmp/cceeOM6F.o: In function `producer’: Producers_Consumers.c:(.text+0x1e): undefined reference to `sem_init’ Producers_Consumers.c:(.text+0x3a): undefined reference to `sem_init’ Producers_Consumers.c:(.text+0x46): undefined reference to `sem_wait’ Producers_Consumers.c:(.text+0x52): undefined reference to `sem_wait’ Producers_Consumers.c:(.text+0x5e): undefined reference to `sem_post’ Producers_Consumers.c:(.text+0x6a): undefined reference to `sem_post’ /tmp/cceeOM6F.o: In function `consumer’: Producers_Consumers.c:(.text+0x7e): undefined reference to […]

用户和内核空间之间的共享信号量

精简版 是否可以在用户空间和内核空间之间共享信号量(或任何其他同步锁)? 命名的POSIX信号量具有内核持久性 ,这就是为什么我想知道是否有可能从内核上下文创建和/或访问它们。 由于有关正常使用POSIX信号量的大量信息,搜索互联网并没有多大帮助。 长版 我正在为实时系统开发一个统一的界面 ,我在其中添加了一些书籍,由信号量保护。 这些书籍保留是在资源分配和解除分配上完成的,这是在非实时环境中完成的。 使用RTAI,等待和发布信号量的线程需要处于实时上下文中。 这意味着使用RTAI的命名信号量意味着在用户空间中的每个等待/发布上切换实时和非实时上下文,更糟糕的是,为内核空间中的每个sem / wait创建一个短实时线程。 我正在寻找的是一种在内核和用户空间之间共享正常Linux或POSIX信号量的方法,这样我就可以安全地在非实时环境中等待/发布它。 任何有关此主题的信息将不胜感激。 如果这是不可能的,你还有其他任何想法如何完成这项任务? 1 1一种方法是添加系统调用,在内核空间中具有信号量,并让用户空间进程调用该系统调用,并且信号量将全部在内核空间中进行管理。 如果我不是因为这个而不必修补内核,我会更高兴。

信号量实施

我在以下程序中遇到错误。 我想演示两个进程如何使用信号量共享变量。 谁能指导我? 我无法调试错误…… #include #include #include #include #include #include int main() { int pid,mutex=1; int semid; /* semid of semaphore set */ key_t key = 1234; /* key to pass to semget() */ int nsems = 1; /* nsems to pass to semget() */ semid=semget(key,nsems,IPC_CREAT|0666); if (semid<0) { perror("Semaphore creation failed "); } if […]

生产者消费者计划使用信号量和pthreads

我已经为生产者 – 消费者问题写了一个代码。但是我没有得到输出。没有编译错误,但在我的程序中发出警告。我很困惑。非常努力。但是无法得到它。请告诉我什么在我的程序中是错误的。什么是正确的程序。我感到沮丧。请帮助伙计们。 这是代码 – #include #include #include #include #define BUFF_SIZE 5 /* total number of slots */ #define NP 3 /* total number of producers */ #define NC 3 /* total number of consumers */ #define NITERS 4 /* number of items produced/consumed */ typedef struct { int buf[BUFF_SIZE]; /* shared var */ int […]

C&低级信号量实现

我正在考虑如何使用尽可能少的asm代码来实现信号量(不是二进制)。 我没有成功地在没有使用互斥锁的情况下思考和编写它,所以这是迄今为止我能做的最好的事情: 全球: #include #include #include #include typedef struct { atomic_ullong value; pthread_mutex_t *lock_op; bool ready; } semaphore_t; typedef struct { atomic_ullong value; pthread_mutex_t lock_op; bool ready; } static_semaphore_t; /* use with static_semaphore_t */ #define SEMAPHORE_INITIALIZER(value) = {value, PTHREAD_MUTEX_INITIALIZER, true} function: bool semaphore_init(semaphore_t *semaphore, unsigned long long init_value) { if(semaphore->ready) if(!(semaphore->lock_op = \ calloc(1, sizeof(pthread_mutex_t)))) […]

使用Semaphores的程序在Linux上运行良好…在Mac OSX上出现意外结果

我写了一个简单的程序,使用信号量解决了Readers-Writers问题。 它在Linux操作系统上运行完美,但是当我在Mac OSX上运行时,我得到了意想不到的结果,我无法弄清楚原因。 我的计划: #include #include #include #include #include void* function1(void* val); void* function2(void* val); // shared values volatile int X; volatile int Y; // declare semaphores sem_t s1; sem_t s2; main() { void* status; pthread_t thread1; pthread_t thread2; srand(time(NULL)); // initialize semaphores to zero sem_init(&s1, 0, 0); sem_init(&s2, 0, 0); pthread_create(&thread1, NULL, function1, NULL); […]

如何在C中的分叉进程上使用POSIX信号量?

我想分叉多个进程,然后在它们上使用信号量。 这是我尝试过的: sem_init(&sem, 1, 1); /* semaphore*, pshared, value */ . . . if(pid != 0){ /* parent process */ wait(NULL); /* wait all child processes */ printf(“\nParent: All children have exited.\n”); . . /* cleanup semaphores */ sem_destroy(&sem); exit(0); } else{ /* child process */ sem_wait(&sem); /* P operation */ printf(” Child(%d) is in […]

如何使用共享内存在进程之间共享信号量

我必须将N个客户端进程与一个服务器同步。 这些进程由一个main函数分叉,我在其中声明了3个信号量。 我决定使用POSIX信号量,但我不知道如何在这些进程之间共享它们。 我认为共享内存应该正常工作,但我有一些问题: 如何在我的细分中分配正确的内存空间? 我可以在shmget size_t字段中使用sizeof(sem_t)来准确分配我需要的空间吗? 有没有人有类似这种情况的例子?