From c3ce403df901ffa41bf826010e209e1260338b93 Mon Sep 17 00:00:00 2001 From: Martin Larralde <martin.larralde@embl.de> Date: Wed, 3 Aug 2022 04:41:28 +0200 Subject: [PATCH] Add an `atomic_vector` wrapper for `vector` where `push_back` is thread-safe --- pyfastani/_atomic_vector.hpp | 21 +++++++++++++++++++++ pyfastani/_atomic_vector.pxd | 5 +++++ 2 files changed, 26 insertions(+) create mode 100644 pyfastani/_atomic_vector.hpp create mode 100644 pyfastani/_atomic_vector.pxd diff --git a/pyfastani/_atomic_vector.hpp b/pyfastani/_atomic_vector.hpp new file mode 100644 index 0000000..a3ebcc0 --- /dev/null +++ b/pyfastani/_atomic_vector.hpp @@ -0,0 +1,21 @@ +#ifndef _SAFEVEC_HPP +#define _SAFEVEC_HPP + +#include <mutex> +#include <vector> + + +template <class T> +class atomic_vector: public std::vector<T> { +protected: + std::mutex mutex; +public: + atomic_vector(): std::vector<T>(), mutex() {} + void push_back(const T& val) { + mutex.lock(); + std::vector<T>::push_back(val); + mutex.unlock(); + } +}; + +#endif diff --git a/pyfastani/_atomic_vector.pxd b/pyfastani/_atomic_vector.pxd new file mode 100644 index 0000000..1c07986 --- /dev/null +++ b/pyfastani/_atomic_vector.pxd @@ -0,0 +1,5 @@ +from libcpp.vector cimport vector + +cdef extern from "_atomic_vector.hpp" nogil: + cdef cppclass atomic_vector[T](vector[T]): + pass -- GitLab