On 2/23/23 19:14, oliver.kowalke--- via Boost wrote:
Code from namespace detail is not part of the public API. Do not use this code (boost::fiber::detail::futex).
Also, if you can't use waiting/notifying operations in std::atomic, I suggest using Boost.Atomic instead.
23.02.2023 14:51:39 tsoumplekas_giorgos via Boost
: Subject: Futex using boost, threads never wakeup Hello all I posted the following question in stackoverflow https://stackoverflow.com/questions/75538799/futex-using-boost-threads-never... 0 https://stackoverflow.com/posts/75538799/timeline
I am studying about futex synchronisation Following up the manual https://man7.org/linux/man-pages/man2/futex.2.html , I tried to syncroniaze threads using boost futex However the threads never wake up
#include <iostream>#include <atomic>#include
#include <thread>#include <vector>#include <chrono>void wait(std::atomic<int> & futexp){ int one = 1; while(std::atomic_compare_exchange_strong(&futexp, &one, 0)) {} std::cout << std::this_thread::get_id() << "," << futexp.load() << std::endl; boost::fibers::detail::futex_wait(&futexp,0); // std::this_thread::sleep_for(std::chrono::milliseconds(5000)); }void fpost(std::atomic<int> & futexp){ int zero = 0; if (std::atomic_compare_exchange_strong(&futexp, &zero, 1)) { boost::fibers::detail::futex_wake(&futexp); } }
std::atomic<int> futexp{1};int main() { std::vectorstd::thread vec; for(int i =0 ; i< 5;++i) { vec.emplace_back([]() { wait(futexp); fpost(futexp); }); }
Code demo https://godbolt.org/z/94hMsrW4a
I am using boost 1.66 and gcc 9.1 What goes wrong with this piece of code ?
Who is going to wake the first thread? Also, your code is not protected against spurious wakeups.