代码之家  ›  专栏  ›  技术社区  ›  GrahamS

如何在LynxOS/POSIX中同步对共享内存的访问?

  •  10
  • GrahamS  · 技术社区  · 16 年前

    LynxOS SE (POSIX兼容)通过共享内存进行通信的系统。

    一个进程将充当“生产者”,另一个进程将充当“消费者”。在多线程系统中,我的方法是使用mutex和condvar(条件变量)对,消费者等待condvar(条件变量) pthread_cond_wait pthread_cond_signal )当共享内存更新时。

    如何在多进程而不是多线程的体系结构中实现这一点?

    有没有LynxOS/POSIX方法来创建可以在进程之间使用的condvar/mutex对?

    4 回复  |  直到 16 年前
        1
  •  8
  •   nos    16 年前

    创建进程共享mutex/cond的标准方法。变量是用一个属性初始化它们,在该属性中设置pthread\u mutexattr\u setpshared/pthread\u condattr\u setpshared。看看LynxOS是否支持。

    您自然需要放置这样的mutex/cond。共享内存中的变量,所以所有进程都可以使用它。

        2
  •  28
  •   Louis Go    5 年前


    最后(为了清楚起见,不包括错误处理),我做了如下工作:

    1.定义共享内存结构

    它包含进程间同步对象和要共享的数据。

    typedef struct
    {
        // Synchronisation objects
        pthread_mutex_t ipc_mutex;
        pthread_cond_t  ipc_condvar;
        // Shared data
        int number;
        char data[1024];
    } shared_data_t;
    

    在主进程上创建一个新的共享内存对象:

    fd = shm_open(SHAREDMEM_FILENAME, O_CREAT|O_EXCL|O_RDWR, S_IRUSR|S_IWUSR);
    ftruncate(fd, sizeof(shared_data_t));
    

    在从属服务器上,仅附加到现有对象:

    fd = shm_open(SHAREDMEM_FILENAME, O_RDWR, S_IRUSR|S_IWUSR);
    

    // Specify addr of calling address, mostly use NULL is most portable way
    shared_data_t* sdata = (shared_data_t*)mmap(NULL, sizeof(shared_data_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    close(fd);
    

    4.初始化同步变量(仅主进程)

    pthread_mutexattr_t mutex_attr;
    pthread_mutexattr_init(&mutex_attr);
    pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED);
    pthread_mutex_init(&sdata->ipc_mutex, &mutex_attr);
    
    pthread_condattr_t cond_attr;
    pthread_condattr_init(&cond_attr);
    pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);
    pthread_cond_init(&sdata->ipc_condvar, &cond_attr);
    

    就这样。

    Mutex和cond现在可以正常地用于控制对共享数据的访问。

    munmap() 和 shm_unlink() 按要求。

    shmget() , shmat() 等等)哪个更有用 如果 它们是可用的,但它们不在我使用的LynxOS SE版本上。

        3
  •  8
  •   Nikolai Fetissov    16 年前

    这件事已经结束了 unnamed POSIX semaphores ,即信号量本身被放置在共享内存中。

        4
  •  6
  •   mcabral    16 年前
    推荐文章