【问题标题】:Is it possible to create a global semaphore for all processes?是否可以为所有进程创建全局信号量?
【发布时间】:2012-07-30 18:30:45
【问题描述】:

我的代码中有信号量问题。

这是我构建的结构:

struct PipeShm
{
        // doesn't matter 
        sem_t *mutex;
        int init;
        // more fields
};

这里我初始化结构体:

struct PipeShm myPipe ;
myPipe.mutex = NULL;
myPipe.init = 0;

而且我使用了一种初始化方法:

int initMethod()
{
    if (!myPipe.init)
    {
        myPipe.mutex = mmap (NULL, sizeof *myPipe.mutex, PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS, -1, 0);
        if (!sem_init (myPipe.mutex, 1, 0))
        {
            myPipe.init = TRUE;
        }
        else
            perror ("initMethod");
    }
    return 1;   
}

这是一个使用上述内容的简单 main :

int main()

{
    int spd, pid, rb;
    char buff[4096];


    shm_pipe_init();
    fork();

        // more code goes here 

        return 0;
}

fork(); 行中(如果我错了请纠正我)2 进程将 有两个不同的信号量,对吧?

如果是这样,我想制作一个全局信号量。那可能吗?

由于我的代码中存在同步问题,我怀疑主要原因是 每个创建的进程都有一个双信号量。

【问题讨论】:

  • @tbert:我不能使用它(我的意思是文件)
  • 那么你可能想看看你的手册页,因为“man sem_init”把我带到了“sem_open”,它说“sem_open() 函数在命名信号量和进程之间建立连接”这看起来与您在这里尝试做的完全一样。
  • 您创建和初始化信号量的代码看起来像是在尝试做正确的事情。您在使用信号量时遇到过具体问题吗?
  • @user315052: 是的,我的进程不断地相互运行,即使我使用信号量和锁定。我真的不知道是什么原因造成的,我尝试了无数次调试,但是nada。我唯一的结论是信号量不是在所有进程之间共享的,这使得所有的地狱刹车都松了……例如:当我fork 时,我没有得到2 outputs,而是得到一次2 outputs,另一次得到@987654331 @
  • 我已经告诉过你关于同一主题的其他问题,你必须在共享段中也有 init 字段,这不能那样工作。您必须在细分市场中拥有整个共享控制结构。你看到我的回答了吗? stackoverflow.com/questions/11708049/…

标签: c linux semaphore


【解决方案1】:

您初始化信号量的代码似乎是正确的,因此您必须在别处寻找同步问题。下面是一个说明代码工作行为的测试程序:

void do_child () {
    fprintf(stderr, "[%u] child: waiting...\n", (unsigned)time(0));
    sem_wait(myPipe.mutex);
    fprintf(stderr, "[%u] child: sleeping 1...\n", (unsigned)time(0));
    sleep(1);
    fprintf(stderr, "[%u] child: posting...\n", (unsigned)time(0));
    sem_post(myPipe.mutex);
    fprintf(stderr, "[%u] child: done...\n", (unsigned)time(0));
}

void do_parent (pid_t p) {
    fprintf(stderr, "[%u] parent: sleeping 5...\n", (unsigned)time(0));
    sleep(5);
    fprintf(stderr, "[%u] parent: posting...\n", (unsigned)time(0));
    sem_post(myPipe.mutex);
    fprintf(stderr, "[%u] parent: waiting...\n", (unsigned)time(0));
    sem_wait(myPipe.mutex);
    fprintf(stderr, "[%u] parent: waitpid...\n", (unsigned)time(0));
    waitpid(p, 0, 0);
    fprintf(stderr, "[%u] parent: done...\n", (unsigned)time(0));
}

int main () {
    pid_t p;
    myPipe.mutex = NULL;
    myPipe.init = 0;
    initMethod();
    switch ((p = fork())) {
    case 0:  do_child(); break;
    case -1: perror("fork"); break;
    default: do_parent(p); break;
    }
    return 0;
}

我想你已经知道了,但以防万一,信号量并不是真正的互斥体。您可以将互斥锁视为初始化为1 的后置值的信号量。但是,信号量并不能阻止同时发布多个帖子。如果您在信号量中有虚假帖子,这将允许多个线程进入临界区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多