在 Linux 中,C++11 提供了对多线程编程的支持,其中包括互斥锁(mutex)
使用 std::lock_guard
或 std::unique_lock
:
当需要保护共享资源时,可以使用 std::lock_guard
或 std::unique_lock
来自动管理互斥锁。它们在构造时自动锁定互斥锁,在析构时自动解锁互斥锁。这样可以避免忘记解锁导致的死锁问题。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print_block(int n, char c) {
std::lock_guard<std::mutex> lock(mtx);
for (int i = 0; i < n; ++i) {
std::cout << c;
}
std::cout << std::endl;
}
int main() {
std::thread t1(print_block, 50, '*');
std::thread t2(print_block, 50, '$');
t1.join();
t2.join();
return 0;
}
避免嵌套锁:
尽量避免在一个线程中多次锁定同一个互斥锁,这可能导致死锁。如果需要多次锁定,可以考虑使用 std::recursive_mutex
,但要注意不要滥用。
使用条件变量: 当多个线程需要等待某个条件满足时,可以使用条件变量(condition variable)。条件变量与互斥锁结合使用,可以避免虚假唤醒和忙等待。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void print_block() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; });
std::cout << "Ready!" << std::endl;
}
void set_ready() {
std::lock_guard<std::mutex> lock(mtx);
ready = true;
cv.notify_one();
}
int main() {
std::thread t1(print_block);
std::thread t2(set_ready);
t1.join();
t2.join();
return 0;
}
尽量减小锁的粒度: 尽量减少锁保护的代码范围,以减小锁的粒度。这样可以降低死锁的风险,提高程序的性能。
使用读写锁:
当读操作远多于写操作时,可以考虑使用读写锁(如 std::shared_mutex
),以提高并发性能。读写锁允许多个线程同时读取共享资源,但在写入时会阻塞其他线程的读写操作。
总之,在使用 Linux C++ 多线程时,要注意合理使用互斥锁,避免死锁和性能瓶颈。在实际编程中,还需要根据具体场景选择合适的同步机制。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。