C++中的锁可以设置超时时间吗

535 阅读1分钟

在C++标准库中,标准的互斥锁(std::mutex)和锁守卫(std::lock_guard)等是没有直接支持超时功能的。但是,你可以使用条件变量(std::condition_variable)结合互斥锁来实现超时等待的效果。

下面是一个简单的示例,演示了如何在C++中使用条件变量和互斥锁实现超时等待:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void waitForData() {
    std::unique_lock<std::mutex> lock(mtx);
    if (!cv.wait_for(lock, std::chrono::milliseconds(1000), []{ return ready; })) {
        std::cout << "Timeout occurred!" << std::endl;
        return;
    }
    std::cout << "Data is ready!" << std::endl;
}

void prepareData() {
    std::this_thread::sleep_for(std::chrono::milliseconds(1500)); // 模拟耗时操作
    {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
    }
    cv.notify_one();
}

int main() {
    std::thread t1(prepareData);
    std::thread t2(waitForData);

    t1.join();
    t2.join();

    return 0;
}

在上面的示例中,waitForData函数通过条件变量等待ready变量的变化,如果在指定的时间内没有等到条件满足,就会输出超时信息。prepareData函数模拟了一个耗时操作,然后通知条件变量条件已满足。在main函数中,我们创建了两个线程分别调用这两个函数。