Questions tagged [stdmutex]

44 questions
505
votes
7 answers

std::unique_lock or std::lock_guard?

I have two use cases. A. I want to synchronise access to a queue for two threads. B. I want to synchronise access to a queue for two threads and use a condition variable because one of the threads will wait on content to be stored into the queue by…
chmike
  • 20,922
  • 21
  • 83
  • 106
15
votes
2 answers

Is there any reason C++ 11+ std::mutex should be declared as a global variable instead of passed into a std::thread as a function parameter?

I've seen most examples using std::mutex where the mutex is global. I was wondering is there any specific reason why this is done? I've had programs of my own where I don't do this, and simply pass the mutex in as a std::thread std::ref. Isn't it…
Krupip
  • 4,404
  • 2
  • 32
  • 54
14
votes
2 answers

How is std::atomic_ref implemented for non-atomic types?

I am wondering how can std::atomic_ref be implemented efficiently (one std::mutex per object) for non-atomic objects as the following property seems rather hard to enforce: Atomic operations applied to an object through an atomic_ref are atomic…
Nonyme
  • 1,220
  • 1
  • 11
  • 22
13
votes
1 answer

Why is std::mutex so much worse than std::shared_mutex in Visual C++?

Ran the following in Visual Studio 2022 in release mode: #include #include #include #include std::mutex mx; std::shared_mutex smx; constexpr int N = 100'000'000; int main() { auto t1 =…
Alex Guteniev
  • 12,039
  • 2
  • 34
  • 79
13
votes
1 answer

Why is std::mutex a standard-layout class?

[thread.mutex.class]/3: [...] It is a standard-layout class ([class.prop]). What is the reason for this requirement?
Alex Guteniev
  • 12,039
  • 2
  • 34
  • 79
12
votes
1 answer

Is a copy-on-return operation executed prior or after lock_guard destructor?

Is the get_a() function safe for race-conditions or do I need to explicitly copy str_ as in get_b() in order to have a thread-safe function? class Class { public: auto get_a() -> std::string { auto&& guard = std::lock_guard{mutex_}; return…
Viktor Sehr
  • 12,825
  • 5
  • 58
  • 90
11
votes
1 answer

Using std::mutex as member variable in a class

I have defined a class that has std::mutex my_mutex as its private member variable. But when I try to use it using lock_guard in a member function which is called from different threads, the compiler throws up a lots of errors. If I keep this mutex…
Prashant
  • 1,144
  • 8
  • 17
  • 28
10
votes
1 answer

Why do functions using std::mutex make a null check of the address of pthread_key_create?

Take this simple function that increments an integer under a lock implemented by std::mutex: #include std::mutex m; void inc(int& i) { std::unique_lock lock(m); i++; } I would expect this (after inlining) to compile in…
BeeOnRope
  • 60,350
  • 16
  • 207
  • 386
8
votes
4 answers

Is my wait - notify mechanism using std::mutex correct?

I started using std::mutexes to stop a thread and wait for another thread to resume it. It works like this: Thread 1 // Ensures the mutex will be locked while(myWaitMutex.try_lock()); // Locks it again to pause this…
Tomáš Zato
  • 50,171
  • 52
  • 268
  • 778
6
votes
2 answers

Why is sizeof std::mutex == 40 when cache line size is often 64 bytes

Following static_assert passes in both gcc and clang trunk. #include int main(){ static_assert(sizeof(std::mutex)==40); } Since x86 CPUs have 64 byte cache line I was expecting mutex sizeof to be 64, so false-sharing can be avoided. Is…
NoSenseEtAl
  • 28,205
  • 28
  • 128
  • 277
6
votes
1 answer

Different behavior when `std::lock_guard` object has no name

I'm learning about std::mutex, std::thread and I am surprised at the different behavior of 2 pieces of code below: #include #include #include using namespace std; std::mutex mtx; void foo(int k) { …
rsy56640
  • 299
  • 1
  • 3
  • 13
6
votes
3 answers

std::mutex in shared memory not working

I have a scenario where the shared memory area is exclusively accessed by two different processes. When I launch the processes, the first process successfully locks the mutex, updates the memory and unlock the mutex. But I observe that when the…
klekle
  • 81
  • 1
  • 5
5
votes
1 answer

Is c++ singleton need memory barrier while using mutex?

I have known that mutex can also bring the effect as memory barrier from here: Can mutex replace memory barriers, but I always see there is an memory barrier using in c++ singleton example as below, is the memory barrier unnecessary? Singleton*…
woder
  • 647
  • 5
  • 12
5
votes
1 answer

Why did CRITICAL_SECTION performance become worse on Win8

It seems like CRITICAL_SECTION performance became worse on Windows 8 and higher. (see graphs below) The test is pretty simple: some concurrent threads do 3 million locks each to access a variable exclusively. You can find the C++ program at the…
Rom098
  • 2,445
  • 4
  • 35
  • 52
5
votes
4 answers

Why the constructor of std::mutex in C++ does not throw?

The pthread_mutex_init() function returns a non-zero value when it fails to initialize the mutex, while the std::mutex class in C++11 has a constructor of noexcept. Say one chooses to implement a C++ mutex class on top of pthreads mutex. He wraps…
John Z. Li
  • 1,893
  • 2
  • 12
  • 19
1
2 3