Допустим, у меня есть процесс A и процесс B, и процесс A хотел бы передать строку C процессу B через общую память shm_open () + mmap ().
Какой самый эффективный способ задержки?
Ответ на этот пост говорит о том, что после C ++ 11 std :: atomic является правильным способом обмена данными через разделяемую память.
Однако я не вижу, как написать что-то, чтобы написать строку C с чем-то вроде этого:
struct Buffer {
std::atomic<uint32_t> length;
std::atomic<char*> str;
} __attribute__((packed));
Учитывая, что у меня есть общая память, созданная следующим образом:
class SHM {
char* _ptr;
public:
SHM() {
const auto handle = shm_open("myTest", O_RDWR|O_CREAT, 0666);
const auto size = 4 * 1024 * 1024;
if (-1 == ftruncate(handle, size)) {
throw;
}
_ptr = (char*)mmap(0,size , PROT_READ | PROT_WRITE, MAP_SHARED, handle, 0);
if(_ptr == MAP_FAILED){
throw;
}
int rc = fchmod(handle, 0666);
if (rc == -1) {
throw;
}
}
// assume to caller will do buffer.size.store(someLength, std::memory_order_release); after filling up Buffer::str
Buffer& getBuffer() noexcept {
return *reinrepret_cast<Buffer*>(_ptr);
}
Buffer& read() {
auto& buffer = *reinrepret_cast<Buffer*>(_ptr);
while (buffer.size.load(std::memory_order_acquire) > 0) {
buffer.str.load(std::memory_order_relaxed);
return buffer;
}
}
};
Как вызывающий абонент SHM::getBuffer()
может правильно записать в Buffer :: str char by char, чтобы процесс B мог вызвать SHM::read()
для извлечения?
Действительно ли buffer.str.load (std :: memory_order_relaxed) загружается атомарно и правильно? Я сомневаюсь в этом, поскольку он даже не знает длины.
Это для Linux, X86-64, GCC 7.
Заранее спасибо.