2

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

这是我构建的结构:

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进程会有两个不同的信号量,对吧?

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

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

4

1 回答 1

2

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

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. 但是,信号量并不能阻止同时发布多个帖子。如果您对信号量有虚假帖子,这将允许多个线程进入关键部分。

于 2012-07-30T19:04:25.960 回答