277
© The Author(s) 2020
S. Scargall, Programming Persistent Memory, https://doi.org/10.1007/978-1-4842-4932-1_14
CHAPTER 14
Concurrency and
Persistent Memory
This chapter discusses what you need to know when building multithreaded
applications for persistent memory. We assume you already have experience with
multithreaded programming and are familiar with basic concepts such as mutexes,
critical section, deadlocks, atomic operations, and so on.
The first section of this chapter highlights common practical solutions for building
multithreaded applications for persistent memory. We describe the limitation of
the Persistent Memory Development Kit (PMDK) transactional libraries, such as
libpmemobj and libpmemobj-cpp, for concurrent execution. We demonstrate simple
examples that are correct for volatile memory but cause data inconsistency issues on
persistent memory in situations where the transaction aborts or the process crashes.
We also discuss why regular mutexes cannot be placed as is on persistent memory and
introduce the persistent deadlock term. Finally, we describe the challenges of building
lock-free algorithms for persistent memory and continue our discussion of visibility vs.
persistency from previous chapters.
The second section demonstrates our approach to designing concurrent data
structures for persistent memory. At the time of publication, we have two concurrent
associative C++ data structures developed for persistent memory - a concurrent
hash map and a concurrent map. More will be added over time. We discuss both
implementations within this chapter.
All code samples are implemented in C++ using the libpmemobj-cpp library
described in Chapter 8. In this chapter, we usually refer to libpmemobj because it
implements the features and libpmemobj-cpp is only a C++ extension wrapper for it.
The concepts are general and can apply to any programming language.
Précédent

- 301/457

Suivant