首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发环境中的C++11 std::vector

并发环境中的C++11 std::vector
EN

Stack Overflow用户
提问于 2013-02-14 01:27:13
回答 1查看 12.1K关注 0票数 11

我在C++11中运行多线程代码时遇到了问题(段错误)。下面是代码:

代码语言:javascript
复制
#include <vector>
#include <thread>

std::vector<int> values;
int i;

void values_push_back()
{
    values.push_back(i);
}

int main()
{
    while(true)
    {
        std::vector<std::thread> threads;

        for(i=0; i<10; ++i)
        {
            std::thread t(values_push_back);
            threads.push_back(std::move(t));
        }
        for(i=0; i<10; ++i)
            threads[i].join();
    }

    return 0;
}

这里是gdb上的回溯:http://pastebin.com/5b5TN70c

这有什么错呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-14 01:29:51

这与移动无关。

多个线程正在同一vector上执行vector::push_back(),但vector::push_back()不是线程安全的。需要同步对vector的修改。

可以使用std::mutex来同步对push_back()的调用

代码语言:javascript
复制
std::vector<int> values;
std::mutex values_mutex;

void values_push_back()
{
    values_mutex.lock();
    values.push_back(i);
    values_mutex.unlock();
}

此外,变量i在没有同步的情况下在线程之间共享,这将导致争用条件(这可能导致在vector中添加重复的int)。考虑将int值作为参数传递给线程,以避免出现这种情况:

代码语言:javascript
复制
std::vector<int> values;
std::mutex values_mutex;

void values_push_back(int i)
{
    values_mutex.lock();
    values.push_back(i);
    values_mutex.unlock();
}

for (int i = 0; i < 10; ++i)
{
    threads.push_back(std::thread(values_push_back, i));
}

for (auto& t: threads) t.join();

正如bamboon评论的那样,首选std::lock_guard以确保在push_back()抛出时释放锁(在本例中只能是bad_alloc(),但如果vector更改为包含具有抛出构造函数的更复杂的对象,则它变得更加重要):

代码语言:javascript
复制
void values_push_back(int i)
{
    std::lock_guard<std::mutex> lk(values_mutex);
    values.push_back(i);
}
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14859353

复制
相关文章

相似问题

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