首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可替代自旋锁的障碍?

可替代自旋锁的障碍?
EN

Stack Overflow用户
提问于 2016-06-26 06:17:23
回答 2查看 615关注 0票数 0

假设我有一个函数,多个线程需要在某种锁定步骤中运行。

代码语言:javascript
运行
复制
std::atomic<bool> go = false;  

void func() {
        while (!go.load()) {} //sync barrier
        ...
}

我想摆脱自旋锁,把它替换为基于互斥锁的东西,因为我有很多线程在做各种各样的事情,而自旋锁的十几个线程对整体吞吐量来说是不稳定的,如果我在自旋锁中包含了睡眠(1),它运行得更快。

那么,STL中是否有类似于HLSL中的AllMemoryBarrierWithGroupSync()的东西呢?基本上,它只会让每个线程在屏障上睡觉,直到所有线程都到达。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-26 07:22:51

听起来就像你想要做一个条件变量是好的。

代码语言:javascript
运行
复制
bool go = false;
std::mutex mtx;
std::condition_variable cv;

void thread_func()
{
    {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return go; });
    }
    // Do stuff
}

void start_all()
{
    {
        std::unique_lock<std::mutex> lock(mtx);
        go = true;
    }
    cv.notify_all();
}
票数 1
EN

Stack Overflow用户

发布于 2016-06-26 07:01:49

如果您愿意使用实验特性,那么latchbarrier将帮助您。否则,您可以使用conditional_variableconditional_variable_anyshared_lock (C++17功能)创建自己的类似构造。

使用shared_mutex实现一个屏障:

代码语言:javascript
运行
复制
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <shared_mutex>
#include <thread>
#include <vector>

std::shared_mutex mtx;
std::condition_variable_any cv;
bool ready = false;

void thread_func()
{
    {
        std::shared_lock<std::shared_mutex> lock(mtx);
        cv.wait(lock, []{return ready;});
    }
    std::cout << '0';
    //Rest of calculations
}


int main()
{
    std::vector<std::thread> threads;
    for(int i = 0; i < 5; ++i)
        threads.emplace_back(thread_func);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::unique_lock<std::shared_mutex> lock(mtx);
        std::cout << "Go\n";
        ready = true;
    }
    cv.notify_all();
    for(auto& t: threads)
        t.join();
    std::cout << "\nFinished\n";
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38035753

复制
相关文章

相似问题

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