1

我在TBB 论坛上问过这个问题,但我希望这里的人可能有一些额外的想法。我正在调试我们看到的一个问题,并注意到来自tbb::concurrent_vector.

底线是push_back()调用实际完成后,size()concurrent_vector并没有反映这一点。我已将其范围缩小为与容量相关,因为如果我捕获capacity()and size()size() == capacity() => true这使我相信size()返回的是容量而不是元素的实际数量。

我创建了一个简单的程序来复制这个问题,它最常在向量为空时触发。为简单起见,该程序只是在调用返回size() != 0后立即断言。push_back()我希望有人能告诉我这是预期的行为还是错误。

#include <boost/thread.hpp>
#include <tbb/concurrent_vector.h>

typedef tbb::concurrent_vector<int> vec_type;

void invokePushBack(vec_type * vec)
{
    for(int i = 0 ; i < 10 ; ++i)
    {
        vec_type::iterator it = vec->push_back(1);
        assert(vec->size() != 0);
    }
}

int main()
{
    // note: the race condition doesn't always trigger,
    //       so we loop until it does.
    while(true)
    {
        vec_type vec;
        boost::thread_group tg;
        for(int i = 0 ; i < 5 ; ++i)
            tg.create_thread(boost::bind(invokePushBack, &vec));
        tg.join_all();
    }
}

根据他们的参考手册

push_back() "将值的副本附加到向量的末尾。"

size() 返回“向量中的元素数。结果可能包括已分配但仍在通过并发调用任何增长方法 (5.6.3) 构建的元素。”

基于此,我认为至少size()应该体现一次回报。push_back()push_back()

4

1 回答 1

1

I ended up solving this issue. It turns out it is 'by-design' in concurrent_vector. See this link for a forum response about it.

于 2011-03-23T15:49:47.733 回答