- 论坛徽章:
- 0
|
本帖最后由 longshadian 于 2015-05-31 11:51 编辑
两个进程使用共享内存,共享内存中存放一个信号量。
persist进程创建共享内存和信号量,然后wait。
game进程往共享内存中写数据,然后post,唤 醒persist进程,自己wait等待persist进程处理完后唤 醒
自己。
persist进程被game进程唤 醒后dosomething,然后post,唤 醒game进程,然后本身再次wait,等待下次
被game进程唤 醒
想象中的应该这么状态。
结果persist进程第一次被game进程唤 醒dosomethin后,post后唤 醒的是自己,没有唤 醒game进程。
。。结果game进程始终处于等待中。如果persist进程sleep了,那么能正常唤 醒game进程。
网上查了下,都是抄来抄去的。翻了下<<Linux/Unix系统编程>>:
如果在sem_post()调用之前信号量的值为0,并且其他某个进程正在因等待递减这个信号量
而阻塞,那么该进程会被唤 醒,它的sem_wait()调用会继续往前执行来缔结这个信号量。
如果多个进程在sem_wait()中阻塞了,并且这些进程的调度采用的是默认的循环时间分享策略,那么哪
个进程会被唤 醒并允许递减这个信号量是不确定的(与System V信号量一样,POSIX信号量仅仅是一种同
步机制,而不是一种排队机制)
现在这种情况该怎么解释。。。求解惑
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <semaphore.h>
#include <cstdio>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <cstring>
#include <string>- int persist()
- {
- const char* name = "data.smem";
- int fd = shm_open(name, O_CREAT | O_EXCL | O_RDWR, 0777);
- if (fd < 0) {
- printf("ERROR shm_open %d\n", fd);
- return 0;
- }
-
- if (ftruncate(fd, 1000) == -1) {
- printf("ERROR ftruncate %d\n", errno);
- return 0;
- }
- void* addr = mmap(NULL, 1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- if (addr == MAP_FAILED) {
- printf("ERROR mmap %d\n", errno);
- return 0;
- }
- if (sem_init((sem_t*)addr, 1, 0) == -1) {
- printf("ERROR sem_init %d\n", errno);
- return 0;
- }
- sem_t* pMtx = (sem_t*)addr;
- addr = (char*)addr + sizeof(sem_t);
- int n = 3;
- while (n--) {
- sem_wait(pMtx);/////////////////////这里等待game进程同步,
- write(STDOUT_FILENO, addr, 1000-sizeof(sem_t));
- sem_post(pMtx);//////////[color=Red]这里应该会唤 醒game进程,结果立即唤 醒了自己,这
- 样就处于死循环中[/color]
- //sleep(1);//////////////////[color=Red]如果这里sleep了那么能够正常唤 醒game进程
- [/color]
- }
- return 0;
- }
复制代码 game进程打开共享内存,往共享内存中写数据,写完后唤 醒persist。- int game()
- {
- const char* name = "data.smem";
- int fd = shm_open(name, O_EXCL | O_RDWR, 0777);
- if (fd < 0) {
- printf("ERROR shm_open %d\n", fd);
- return 0;
- }
- void* addr = mmap(NULL, 1000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- sem_t* pMtx = (sem_t*)addr;
- addr = (char*)addr + sizeof(sem_t);
- std::string str = "abcdefg\n";
- std::memcpy(addr, str.c_str(), str.length());
- sem_post(pMtx);/////////////唤 醒persist进程
- sem_wait(pMtx);////////////persist进程处理完后唤 醒自己
- return 0;
- }
复制代码 我的是ubuntu 14.04,哪位大侠能帮我测试下该段代码 |
|