boost named_condition не вызывает процесс ожидания
У меня есть 2 процесса (производитель и потребитель), совместно использующих деку int в разделяемой памяти, у меня процесс продюсера помещает в деку 2 числа, а затем он переходит в состояние ожидания, теряя блокировку мьютекса. Затем потребительский процесс удаляет числа и печатает их. Затем он уведомляет об условии, которого ожидает производитель. Затем потребитель уходит в ожидании второго условия. После этого случая продюсер не просыпается. Я использую один и тот же мьютекс между процессами. Пожалуйста, найдите весь код ниже.
Включить файл shared_memory.h:
#ifndef SharedMemory_h
#define SharedMemory_h
#include
#include
#include
#include
#include
#include
using namespace boost::interprocess;
typedef allocator ShmemAllocator;
typedef deque Deque;
#endif
Производственный процесс:
#include "shared_memory.h"
struct shm_remove
{
shm_remove() { shared_memory_object::remove("MySharedMemory"); }
~shm_remove() { shared_memory_object::remove("MySharedMemory"); }
} remover;
struct mutex_remove
{
mutex_remove() { named_mutex::remove("MyMutex"); }
~mutex_remove() { named_mutex::remove("MyMutex"); }
} mutex_remover;
//Create shared memory, mutex and condtion
managed_shared_memory segment(create_only, "MySharedMemory", 10000000);
named_mutex mutex(create_only,"MyMutex");
named_condition full(open_or_create,"FullCondition");
named_condition empty(open_or_create,"EmptyCondition");
const ShmemAllocator alloc_inst (segment.get_segment_manager());
int main()
{
Deque* MyDeque;
offset_ptr a, b;
try{
MyDeque = segment.construct("MyDeque")(alloc_inst);
try{
a = static_cast (segment.allocate(sizeof(int)));
b = static_cast (segment.allocate(sizeof(int)));
}catch(bad_alloc &ex){
std::cout < "Could not allocate int" < std::endl;
}
}catch(bad_alloc &ex){
std::cout < "Could not allocate queue" < std::endl;
}
scoped_locksize() == 2)
{
std::cout < "Consumer: " < *MyDeque->front() < std::endl;
MyDeque->pop_front();
}
if (MyDeque->size() == 1)
{
std::cout < "Consumer: " < *MyDeque->front() < std::endl;
MyDeque->pop_front();
full.notify_one();
}
}
}