diff options
author | kulikov <kulikov@yandex-team.com> | 2024-09-12 19:28:16 +0300 |
---|---|---|
committer | kulikov <kulikov@yandex-team.com> | 2024-09-12 19:43:48 +0300 |
commit | 20a8c1bdb3377f5cb86adc3173d7a329245ebaa1 (patch) | |
tree | 2252acf3ab8803ed742b2e35386aaa31e28a8fca | |
parent | 06218aa8d37f8624a4caeff1be3f59217b162158 (diff) | |
download | ydb-20a8c1bdb3377f5cb86adc3173d7a329245ebaa1.tar.gz |
fix tsan warnings in library/cpp/threading unit tests
- blocking_counter: fix destroy order;
- thread_local: Head_.load must use std::memory_order_acquire to match memory_order_release in compare_exchange and ensure all writes are visible; also fix always null node value in first compare_exchange call;
- work_stealing: use atomics.
commit_hash:53f01a16bb40dd3eb890b0eb60388ecb0ce9c908
-rw-r--r-- | library/cpp/threading/thread_local/thread_local.h | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/library/cpp/threading/thread_local/thread_local.h b/library/cpp/threading/thread_local/thread_local.h index 1cc4642373..bb0d11347d 100644 --- a/library/cpp/threading/thread_local/thread_local.h +++ b/library/cpp/threading/thread_local/thread_local.h @@ -222,16 +222,16 @@ public: template <typename ...ConsturctArgs> T* Get(TThread::TId tid, ConsturctArgs&& ...args) { - TNode* node = Head_.load(std::memory_order_relaxed); - for (; node; node = node->Next) { + TNode* head = Head_.load(std::memory_order_acquire); + for (TNode* node = head; node; node = node->Next) { if (node->Key == tid) { return &node->Value; } } - TNode* newNode = AllocateNode(tid, node, std::forward<ConsturctArgs>(args)...); - while (!Head_.compare_exchange_weak(node, newNode, std::memory_order_release, std::memory_order_relaxed)) { - newNode->Next = node; + TNode* newNode = AllocateNode(tid, head, std::forward<ConsturctArgs>(args)...); + while (!Head_.compare_exchange_weak(head, newNode, std::memory_order_release, std::memory_order_relaxed)) { + newNode->Next = head; } return &newNode->Value; |