Get the App
SLTechnology News&Howtos  ›  Servers  › 

Summary of knowledge points of synchronization and mutual exclusion between linux threads

Shulou Source: shulou.com Published: 2022-06-02 03:09:48 09月16日 Update

When threads execute concurrently, we need to ensure safe access to critical resources to prevent threads from competing for resources, resulting in data ambiguity.

Thread synchronization: condition variabl

Why use conditional variables?

For the timing controllability of the critical resource, the condition will notify other threads waiting for the operation of the critical resource, similar to the signal. Scene: T-DAY exhibition queue visit / producer-consumer model

What is the condition variable?

Is a synchronization mechanism in which one thread modifies this variable to meet the conditions under which other threads continue to execute, and other threads receive signals that the conditions have changed.

Conditional variable operation?

Initialize and destroy

Pthread_cond_wait

If the condition is not met, the lock will be released and the wait will be blocked. This function is atomic: 1. Put the thread in the conditional waiting queue 2. Release lock

If the condition is met, the thread will be awakened and locked.

Pthread_cond_signal one-on-one awakening

Wake up a thread in the waiting queue

Pthread_cond_broadcast broadcast Wake up

Wake up all threads in the waiting queue

Why does waiting and unlocking require atomic operations / why do conditional variables use mutexes?

Because the lock in pthread_cond_wait is to protect condition variables from missing signals, if waiting for unlocking is not an atomic operation, such as thread A unlocking first, then CPU time slice switches to thread B, thread B locks and sends condition variable signals, and then switches to thread A, thread A misses the signal before waiting, and may permanently block. Therefore, waiting and unlocking must be atomic.

Why do you need a while cycle to determine whether a critical resource exists?

In an one-to-many case, the producer sends a signal that the waiting thread is awakened and locked, but only one thread can lock it, and the other threads block the waiting lock if the thread runs out of critical resources. it is unreasonable for other threads to go down without judgment.

Should singnal be unlocked first or later?

If the lock is unlocked first, the lock is acquired by the thread that is not blocking waiting, and then the critical resource is used, the unlocked singal is meaningless, that is, false awakening.

First singal wakes up, and then let the awakened threads scramble for locks. Under linux, there are two queues, one is cond_wait, and the other is mutex_lock,singal, which only transfers threads on cond_wait to mutex_lock and does not return user space, which improves efficiency.

Thread mutex: mutex

Why use mutexes?

Unique access to critical resources at the same time to protect critical resources from modification. Scene: scalpers grab tickets

What is a mutex?

It is a counter of 0 to 1, where 1 means there are resources to operate, and 0 means there are no resources to operate on.

Mutex operation?

Initialize and destroy

Lock-if the count is 1, set 0 to perform the desired operation; if the count is 0, the blocking wait count becomes 1

Unlock-count set to 1

These are all the relevant knowledge points of this introduction. Thank you for your study and support.

Tags: Threads conditions resources variables signals blocking atoms queues synchronization representatives scenarios producers miss protection switching reconciliation production knowledge points unreasonable false Apple Docker Huawei Linux macOS MariaDB Microsoft MySQL NVidia OPPO Reno MySQL Xiaomi Huawei Docker MariaDB