首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用timed_mutex?

如何使用timed_mutex?
EN

Stack Overflow用户
提问于 2017-03-06 21:32:40
回答 1查看 315关注 0票数 1

我第一次在timed_mutex工作。直到现在,对我来说,只有lock_guard

但似乎只有第一个try_lock_for才真正成功。除第一个try_lock_for外,所有其他try_lock_for都返回false:

代码语言:javascript
复制
#include <chrono>
#include <future>
#include <mutex>
#include <vector>
#include <iostream>
std::timed_mutex mtx;
long fibX(long n) { return n < 2L ? 1L : fibX(n-1L) + fibX(n-2L); }
long fibCall(long n) {
    using namespace std::chrono;
    if(mtx.try_lock_for(1000ms)) {    // <<< HERE
        return fibX(n);
        mtx.unlock();
    } else {
        return 0L;
    }
}
int main() {
    std::vector< std::future<long> > fs;
    for(long n=1; n<= 42; ++n) {
        fs.emplace_back( std::async(std::launch::async, fibCall, n) );
    }
    for(auto &f : fs) {
        std::cout << f.get() << "\n";
    }
}

我得到了结果1, 0, 0, 0, 0, ...

但是,当第一个调用花费的时间超过1秒时,我希望从1, 2, 3, 5, 8, 13, ... 0, 0, 0, 0, 0开始使用0

可能是个愚蠢的错误,但我看不见.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-06 21:35:55

代码语言:javascript
复制
if(mtx.try_lock_for(1000ms)) {    // <<< HERE
    return fibX(n);
    mtx.unlock();

您的unlock从不执行自return以来。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42635960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档