C ++中的并发效率

时间:2016-02-22 16:13:38

标签: c++ multithreading concurrency tbb

我有一个函数pushMessage()

void pushMessage(const char* msg, const int len)
{
    for (int i=0;i<len;++i)
        queue.push(*(msg+i))
}

有问题的队列是tbb::concurrent_bounded_queue<char>,并且有一个非常大的大小(假设是无限的)。

这个函数由两个线程调用。一个线程不断调用该函数,偶尔调用另一个函数。

确保队列内容没有并发msg混合的最有效方法是什么?我的第一个电话是使用互斥锁,但是我想听到更多,因为我对并发世界很新,我宁愿不仅仅是跳到我学到的第一件事。非常感谢。

P.S。 - 我可以访问Boost和TBB库。

编辑:队列的类型为char,因为它用于逐字节发送消息以提高速度。之前的实现是一次发送整个消息。

3 个答案:

答案 0 :(得分:3)

你没有任何其他选择,只有互斥(或信号量,或关键部分 - 实际上是完全相同的事情)。在当前设计中,没有其他任何东西可以确保非交错消息。

然而,我确实质疑当前设计的智慧。当语义是整个消息时,为什么你有一个字符队列?将整个消息作为单个队列元素不是更好吗?

答案 1 :(得分:0)

一种可能的解决方案可能是使用boost::lockfree::queue<std::string>

然后,您可以在不进一步同步的情况下推送和弹出整个消息。

如果您说必须使用字节,则可以尝试使用boost::lockfree::spsc_queue<char>。你有成员

size_t write_available(size_t max_size) const
size_type push(T const * t, size_type size)

因此,与互斥锁一起,您可以在pushMessage方法

中编写类似的内容
{
    boost::lock_guard<boost::mutex> guard( mutex_);
    if( queue_.write_available( len ) )
        queue_.push( msg, len );
}

答案 2 :(得分:0)

  

确保队列内容的最有效方法是什么   没有混合的并发消息?

根据我的经验(但大多数是前c ++ 11),任何互斥信号量都是轻量级的。当线程很少&#39;碰撞。我从中推断出,上下文切换必须是高成本动作。如果关键部分被解锁,则互斥检查的成本很小。

通常,我使用(并推荐)互斥锁,然后跟进测试以查看行为是否足够。

一个可能有用的比较

a)一个线程可以多少次进入互斥保护的关键部分(即没有竞争)

vs

b)使用相同的互斥锁强制执行时可以完成多少个线程上下文切换。