posix标准Java实现_共享内存中的条件变量 - 此代码是否符合POSIX标准?

POSIX标准是否允许 named 共享内存块包含互斥锁和条件变量?

我们一直在尝试使用互斥和条件变量来同步对LynuxWorks LynxOS-SE system(POSIX-conformant)上的两个进程对命名共享内存的访问 .

一个共享内存块称为 "/sync" ,包含互斥锁和条件变量,另一个是 "/data" ,包含我们同步访问的实际数据 .

如果两个进程都没有在 exactly the same order 中执行 mmap() 调用,或者如果一个进程在其他部分共享内存中映射到mmaps内存之前,我们就会看到 pthread_cond_signal() 的失败 .

这个示例代码与我可以做的一样短:

#include

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

static const string shm_name_sync("/sync");

static const string shm_name_data("/data");

struct shared_memory_sync

{

pthread_mutex_t mutex;

pthread_cond_t condition;

};

struct shared_memory_data

{

int a;

int b;

};

//Create 2 shared memory objects

// - sync contains 2 shared synchronisation objects (mutex and condition)

// - data not important

void create()

{

// Create and map 'sync' shared memory

int fd_sync = shm_open(shm_name_sync.c_str(), O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);

ftruncate(fd_sync, sizeof(shared_memory_sync));

void* addr_sync = mmap(0, sizeof(shared_memory_sync), PROT_READ|PROT_WRITE, MAP_SHARED, fd_sync, 0);

shared_memory_sync* p_sync = static_cast (addr_sync);

// init the cond and mutex

pthread_condattr_t cond_attr;

pthread_condattr_init(&cond_attr);

pthread_condattr_setpshared(&cond_attr, PTHREAD_PROCESS_SHARED);

pthread_cond_init(&(p_sync->condition), &cond_attr);

pthread_condattr_destroy(&cond_attr);

pthread_mutexattr_t m_attr;

pthread_mutexattr_init(&m_attr);

pthread_mutexattr_setpshared(&m_attr, PTHREAD_PROCESS_SHARED);

pthread_mutex_init(&(p_sync->mutex), &m_attr);

pthread_mutexattr_destroy(&m_attr);

// Create the 'data' shared memory

int fd_data = shm_open(shm_name_data.c_str(), O_CREAT|O_RDWR, S_IRUSR|S_IWUSR);

ftruncate(fd_data, sizeof(shared_memory_data));

void* addr_data = mmap(0, sizeof(shared_memory_data), PROT_READ|PROT_WRITE, MAP_SHARED, fd_data, 0);

shared_memory_data* p_data = static_cast (addr_data);

// Run the second process while it sleeps here.

sleep(10);

int res = pthread_cond_signal(&(p_sync->condition));

assert(res==0); //

munmap(addr_sync, sizeof(shared_memory_sync));

shm_unlink(shm_name_sync.c_str());

munmap(addr_data, sizeof(shared_memory_data));

shm_unlink(shm_name_data.c_str());

}

//Open the same 2 shared memory objects but in reverse order

// - data

// - sync

void open()

{

sleep(2);

int fd_data = shm_open(shm_name_data.c_str(), O_RDWR, S_IRUSR|S_IWUSR);

void* addr_data = mmap(0, sizeof(shared_memory_data), PROT_READ|PROT_WRITE, MAP_SHARED, fd_data, 0);

shared_memory_data* p_data = static_cast (addr_data);

int fd_sync = shm_open(shm_name_sync.c_str(), O_RDWR, S_IRUSR|S_IWUSR);

void* addr_sync = mmap(0, sizeof(shared_memory_sync), PROT_READ|PROT_WRITE, MAP_SHARED, fd_sync, 0);

shared_memory_sync* p_sync = static_cast (addr_sync);

// Wait on the condvar

pthread_mutex_lock(&(p_sync->mutex));

pthread_cond_wait(&(p_sync->condition), &(p_sync->mutex));

pthread_mutex_unlock(&(p_sync->mutex));

munmap(addr_sync, sizeof(shared_memory_sync));

munmap(addr_data, sizeof(shared_memory_data));

}

int main(int argc, char** argv)

{

if(argc>1)

{

open();

}

else

{

create();

}

return (0);

}

运行此程序时没有args,然后是另一个带有args的副本,第一个将在断言检查 pthread_cond_signal() 时失败 . 但是在 "/data" 之前将 open() 函数的顺序更改为 mmap() _1178732_并且它将全部正常工作 .

这似乎是LynxOS中的一个主要错误,但是LynuxWorks声称在这个方式中使用这种方式在命名共享内存中使用互斥和条件变量不在POSIX标准中,所以他们不感兴趣 .

任何人都可以确定此代码是否确实违反了POSIX?

或者有没有人有任何令人信服的文件证明它符合POSIX标准?

Edit :我们知道 PTHREAD_PROCESS_SHARED 是POSIX并且受LynxOS支持 . 争用的范围是可以在命名共享内存中使用互斥锁和信号量(正如我们所做的那样),或者当一个进程创建并映射共享内存然后分叉第二个进程时,POSIX只允许使用它们 .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值