#include <libpmemobj++/mutex.hpp>
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/pool.hpp>
#include <mutex>
namespace nvobj = pmem::obj;
void
unique_guard_example()
{
struct root {
nvobj::mutex pmutex;
};
auto pop = nvobj::pool<root>::create("poolfile", "layout",
PMEMOBJ_MIN_POOL);
auto proot = pop.get_root();
std::lock_guard<nvobj::mutex> guard(proot->pmutex);
std::unique_lock<nvobj::mutex> other_guard(proot->pmutex);
}
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/pool.hpp>
#include <libpmemobj++/shared_mutex.hpp>
#include <mutex>
namespace nvobj = pmem::obj;
void
shared_mutex_example()
{
struct root {
nvobj::shared_mutex pmutex;
};
auto pop = nvobj::pool<root>::create("poolfile", "layout",
PMEMOBJ_MIN_POOL);
auto proot = pop.get_root();
proot->pmutex.lock_shared();
std::unique_lock<nvobj::shared_mutex> guard(proot->pmutex);
}
#include <chrono>
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/pool.hpp>
#include <libpmemobj++/timed_mutex.hpp>
namespace nvobj = pmem::obj;
void
timed_mutex_example()
{
struct root {
nvobj::timed_mutex pmutex;
};
auto pop = nvobj::pool<root>::create("poolfile", "layout",
PMEMOBJ_MIN_POOL);
auto proot = pop.get_root();
const auto timeout = std::chrono::milliseconds(100);
proot->pmutex.try_lock_for(timeout);
proot->pmutex.try_lock_until(std::chrono::steady_clock::now() +
timeout);
}
#include <libpmemobj++/condition_variable.hpp>
#include <libpmemobj++/mutex.hpp>
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/pool.hpp>
#include <mutex>
#include <thread>
namespace nvobj = pmem::obj;
void
cond_var_example()
{
struct root {
nvobj::mutex pmutex;
nvobj::condition_variable cond;
int counter;
};
auto pop = nvobj::pool<root>::create("poolfile", "layout",
PMEMOBJ_MIN_POOL);
auto proot = pop.get_root();
std::thread worker([&] {
std::unique_lock<nvobj::mutex> lock(proot->pmutex);
while (proot->counter < 1000)
++proot->counter;
lock.unlock();
proot->cond.notify_one();
});
std::unique_lock<nvobj::mutex> lock(proot->pmutex);
proot->cond.wait(lock, [&] { return proot->counter >= 1000; });
worker.join();
}