C++ mutex 上锁简单测试
#include <string>
#include <mutex>
#include <iostream>
using namespace std;
namespace
{
    //std::mutex m;
    std::recursive_mutex m; // 可递归
    class Test
    {
    public:
        void test1()
        {
            std::lock_guard<std::recursive_mutex> lock(m);
        }
        void test2()
        {
            std::lock_guard<std::recursive_mutex> lock(m);
            test1();
            cout << "test2()" << endl;
        }
    };
}
#if 1
int main()
{
    Test t;
    t.test2();
    return 0;
}
#endif
输出:
test2()
递归上锁用recursive_mutex,否则会崩。
std::unique_lock 支持手动加锁和解锁:
std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 延迟加锁
lock.lock(); // 手动加锁
// 操作共享数据
lock.unlock(); // 手动解锁
与条件变量配合
std::unique_lock 是唯一可以与 std::condition_variable 配合使用的锁类型:
std::condition_variable cv;
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return shared_data > 0; }); // 等待条件满足
简单生产者和消费者示例:
std::queue<int> data_queue; // 共享队列
std::mutex mtx; // 互斥锁
std::condition_variable cv; // 条件变量
void producer(int id) 
{
	for (int i = 0; i < 5; ++i) 
	{
		std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟生产耗时
		{
			std::unique_lock<std::mutex> lock(mtx); // 加锁
			data_queue.push(i); // 生产数据
			std::cout << "Producer " << id << " produced: " << i << std::endl;
		} // 自动解锁
		cv.notify_one(); // 通知一个消费者
	}
}
void consumer(int id) 
{
	while (true) 
	{
		std::unique_lock<std::mutex> lock(mtx); // 加锁
												// 等待条件满足(队列不为空)
		cv.wait(lock, [] { return !data_queue.empty(); });
		// 消费数据
		int data = data_queue.front();
		data_queue.pop();
		std::cout << "Consumer " << id << " consumed: " << data << std::endl;
		lock.unlock(); // 手动解锁(可选)
	}
}
int main() 
{
	std::thread producers[2];
	std::thread consumers[2];
	// 启动生产者线程
	for (int i = 0; i < 2; ++i) {
		producers[i] = std::thread(producer, i + 1);
	}
	// 启动消费者线程
	for (int i = 0; i < 2; ++i) {
		consumers[i] = std::thread(consumer, i + 1);
	}
	// 等待生产者线程完成
	for (auto& t : producers) {
		t.join();
	}
	// 等待消费者线程完成(这里消费者是无限循环,需要手动终止)
	for (auto& t : consumers) {
		t.detach(); // 分离线程(或使用其他方式终止)
	}
	std::cout << "Main thread finished." << std::endl;
	return 0;
}
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号