C 要创建多少信号量?
我知道信号量用于同步进程以访问共享内存 基本上我不明白要创建多少信号量 假设我只有一段共享内存,两个进程将访问它。然后,只创建一个信号量 但若我有三个或更多的进程将访问相同的共享内存,那个么它需要更多的信号量集吗 创建信号量集的数量取决于什么条件C 要创建多少信号量?,c,semaphore,shared-memory,C,Semaphore,Shared Memory,我知道信号量用于同步进程以访问共享内存 基本上我不明白要创建多少信号量 假设我只有一段共享内存,两个进程将访问它。然后,只创建一个信号量 但若我有三个或更多的进程将访问相同的共享内存,那个么它需要更多的信号量集吗 创建信号量集的数量取决于什么条件 提前谢谢。看看Pearce Wiki 共享内存中有一个pthreads互斥体和条件变量 而是一个信号灯。您可以将此解决方案扩展到两个以上的进程。如果您使用的是semctl(IPC信号量),则需要创建一个信号量。如果您使用的是POSIX信号量(sem_i
提前谢谢。看看Pearce Wiki 共享内存中有一个pthreads互斥体和条件变量
而是一个信号灯。您可以将此解决方案扩展到两个以上的进程。如果您使用的是semctl(IPC信号量),则需要创建一个信号量。如果您使用的是POSIX信号量(sem_init),那么也可以使用一个,但前提是在创建时为pshared参数传递一个真值并将其放在共享内存中 信号量可以跨线程或进程共享。跨进程共享是在操作系统级别实现的。两个或多个不同的进程可以共享相同的信号量,即使这些进程不是通过分叉单个父进程创建的 两种类型的信号量是sysV和POSIX。查找有关差异的更多信息,请访问 sysV信号量是在内核中维护的,因此您不需要为它们分配空间或将它们放在共享内存中来共享它们。但您确实需要为每个使用它们的进程找到它们的方法 有关在父进程及其子进程之间共享未命名UNIX信号量的信息,请参见此示例(要使用gcc编译,需要-pthread标志):
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
/*将信号量放在共享内存中*/
sem_t*sema=mmap(NULL,sizeof(sema),
保护读取、保护写入、地图共享、地图匿名、,
-1, 0);
if(sema==MAP_失败){
佩罗尔(“mmap”);
退出(退出失败);
}
/*创建/初始化信号量*/
if(sem_init(sema,1,0)<0){
perror(“sem_init”);
退出(退出失败);
}
int nloop=10;
int-pid=fork();
if(pid<0){
佩罗尔(“福克”);
退出(退出失败);
}
如果(pid==0){
/*子进程*/
它不取决于访问资源的进程的数量。信号量用于避免同时访问资源。如果只有一个资源,请使用一个资源初始化信号量。一旦一个进程获取了资源,其他两个或多个进程将等待资源释放。一旦根据pro释放了资源cess状态/调度另一进程之一将占用资源
顺序会是这样的
使用一个资源初始化:
sem_init()
获取资源:
sem_wait()或sem_timedwait()
释放资源:
sem_post()您的意思是,无论访问共享内存的进程是两个还是多个,都只需要一个信号量集吗?
semctl()
?信号量集不是单个值,而是一组值。它通过包含多个信号量的信号量集来引用。每个信号量集由标识信号量集的semid和标识集中信号量的semnum标识。可以在一个semop()
调用。这些操作是一个信号量集中多个信号量的原子操作。
#include <semaphore.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
int main(void)
{
/* place semaphore in shared memory */
sem_t *sema = mmap(NULL, sizeof(sema),
PROT_READ |PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,
-1, 0);
if (sema == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
/* create/initialize semaphore */
if ( sem_init(sema, 1, 0) < 0) {
perror("sem_init");
exit(EXIT_FAILURE);
}
int nloop=10;
int pid = fork();
if (pid < 0) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) {
/* child process*/