public inbox for libstdc++-cvs@sourceware.org help / color / mirror / Atom feed
From: Jonathan Wakely <redi@gcc.gnu.org> To: gcc-cvs@gcc.gnu.org, libstdc++-cvs@gcc.gnu.org Subject: [gcc r10-9002] libstdc++: Assigning to a joinable std::jthread calls std::terminate Date: Wed, 11 Nov 2020 11:43:34 +0000 (GMT) [thread overview] Message-ID: <20201111114334.327F5398784C@sourceware.org> (raw) https://gcc.gnu.org/g:7c44b67d83b34e56a4f65afd70754c5e30280247 commit r10-9002-g7c44b67d83b34e56a4f65afd70754c5e30280247 Author: Paul Scharnofske <asynts@gmail.com> Date: Wed Nov 11 09:29:37 2020 +0000 libstdc++: Assigning to a joinable std::jthread calls std::terminate Move assigning to a std::jthread that represents a thread of execution needs to send a stop request and join that running thread. Otherwise the std::thread data member will terminate in its assignment operator. Co-authored-by: Jonathan Wakely <jwakely@redhat.com> libstdc++-v3/ChangeLog: * include/std/thread (jthread::operator=(jthread&&)): Transfer any existing state to a temporary that will request a stop and then join. * testsuite/30_threads/jthread/jthread.cc: Test move assignment. (cherry picked from commit 0ebaea3b6677ef8edfa5638800304db1a4f7c2f8) Diff: --- libstdc++-v3/include/std/thread | 6 +++++- libstdc++-v3/testsuite/30_threads/jthread/jthread.cc | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/std/thread b/libstdc++-v3/include/std/thread index e1bba0cb29b..96e5d1ed4e2 100644 --- a/libstdc++-v3/include/std/thread +++ b/libstdc++-v3/include/std/thread @@ -471,7 +471,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION operator=(const jthread&) = delete; jthread& - operator=(jthread&&) noexcept = default; + operator=(jthread&& __other) noexcept + { + std::jthread(std::move(__other)).swap(*this); + return *this; + } void swap(jthread& __other) noexcept diff --git a/libstdc++-v3/testsuite/30_threads/jthread/jthread.cc b/libstdc++-v3/testsuite/30_threads/jthread/jthread.cc index 746ff437c1d..b8ba62f6df2 100644 --- a/libstdc++-v3/testsuite/30_threads/jthread/jthread.cc +++ b/libstdc++-v3/testsuite/30_threads/jthread/jthread.cc @@ -187,6 +187,25 @@ void test_detach() VERIFY(t1FinallyInterrupted.load()); } +//------------------------------------------------------ + +void test_move_assignment() +{ + std::jthread thread1([]{}); + std::jthread thread2([]{}); + + const auto id2 = thread2.get_id(); + const auto ssource2 = thread2.get_stop_source(); + + thread1 = std::move(thread2); + + VERIFY(thread1.get_id() == id2); + VERIFY(thread2.get_id() == std::jthread::id()); + + VERIFY(thread1.get_stop_source() == ssource2); + VERIFY(!thread2.get_stop_source().stop_possible()); +} + int main() { std::set_terminate([](){ @@ -197,4 +216,5 @@ int main() test_stop_token(); test_join(); test_detach(); + test_move_assignment(); }
reply other threads:[~2020-11-11 11:43 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20201111114334.327F5398784C@sourceware.org \ --to=redi@gcc.gnu.org \ --cc=gcc-cvs@gcc.gnu.org \ --cc=libstdc++-cvs@gcc.gnu.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).