小编Jan*_*ler的帖子

为什么大括号括起来的初始值设定项列表不适用于 std::array

我想用对象列表初始化向量或数组。它适用于向量,但不适用于数组:

struct Widget
{
    string name;
    vector<int> list;
};

struct Object
{
    string name;
    vector<int> list;
    Object(string _name, vector<int> _list) : name(_name), list(_list) { }
};

int main()
{
    const vector<Widget> vw = {
        {"vw1", {1,2,3}},
        {"vw2", {1,2,3}} };
    const array<Widget,2> aw = {
        {"aw1", {1,2,3}},
        {"aw2", {1,2,3}} };
    const vector<Object> vo = {
        {"vo1", {1,2,3}},
        {"vo2", {1,2,3}} };
    const array<Object,2> ao = {
        {"ao1", {1,2,3}},
        {"ao2", {1,2,3}} };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang 的错误:

widget.cpp:36:9: error: excess elements in struct …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

4
推荐指数
1
解决办法
4514
查看次数

布尔标志应该始终是原子的吗?

假设有一个由主线程控制的布尔标志(keep_running).另一个线程无限循环,直到此标志变为false.

int main() {
    bool keep_running(true);
    std::thread run( [](bool &keep_running)
    {
        while(keep_running)
        {
            // do work
        }
    }, std::ref(keep_running) );

    // do other work
    keep_running = false;
    run.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该标志应该是原子的吗?

std::atomic<bool> keep_running
Run Code Online (Sandbox Code Playgroud)

我想,非原子版本可能发生的最糟糕的情况是,当标志被设置为正确时

while(keep_running)
Run Code Online (Sandbox Code Playgroud)

被执行.在这种情况下,循环继续运行一次(非严格需要)迭代.但就我而言,这是可以接受的.

是否存在上述代码可能出错的情况?

编辑:

出于性能原因(以及没有错误),我对此感兴趣.那么,使用std :: atomic作为循环中的标志是否会对性能产生负面影响?

c++ multithreading atomic c++11

2
推荐指数
1
解决办法
918
查看次数

标签 统计

c++ ×2

c++11 ×2

atomic ×1

multithreading ×1