小编Nik*_*Nik的帖子

C/C++无锁(或非阻塞)环形缓冲区,它覆盖了最旧的数据?

我正在尝试找到一种方法来实现无锁或无阻塞方式,为单个消费者/单个消费者创建一个环形缓冲区,它将覆盖缓冲区中最旧的数据.我已经阅读了很多无锁算法,如果缓冲区已满,当你"返回false"时可以工作 - 即不添加; 但是,当你需要覆盖最旧的数据时,我甚至找不到谈论如何做的伪代码.

我正在使用GCC 4.1.2(工作中的限制,我无法升级版本......)并且我有Boost库,并且在过去我制作了自己的Atomic <T>变量类型,它紧跟着upcomming规范(它不完美,但它是线程安全的,并做我需要的).

当我想到它时,我认为使用这些原子应该真正解决问题.关于我在想什么的一些粗糙的伪代码:

template< typename T , unsigned int Size>
class RingBuffer {
private:
Atomic<unsigned int> readIndex;
Atomic<unsigned int> writeIndex;
enum Capacity { size = Size };
T* buf;

unsigned int getNextIndex(unsigned int i)
{
 return (i + 1 ) % size;
}

public:
RingBuffer() { //create array of size, set readIndex = writeIndex = 0 }
~RingBuffer() { //delete data }
void produce(const T& t)
{
 if(writeIndex == getNextIndex(readIndex)) //1
 {
  readIndex = getNextIndex(readIndex); …
Run Code Online (Sandbox Code Playgroud)

c c++ nonblocking circular-buffer

9
推荐指数
1
解决办法
4915
查看次数

无法弄清楚比赛状况在哪里发生

我正在使用Valgrind --tool = drd来检查我的应用程序使用Boost :: thread.基本上,应用程序根据通过套接字连接的输入填充一组"Book"值和"Kehai"值.

在单独的线程上,用户可以连接并将书籍发送给他们.

它相当简单,所以我想在序列化书籍的位置上使用boost :: mutex :: scoped_lock,清除书籍数据的位置应该足以防止任何竞争条件.这是代码:

 void Book::clear()
    {
     boost::mutex::scoped_lock lock(dataMutex);
     for(int i =NUM_KEHAI-1; i >= 0; --i)
     {
      bid[i].clear();

      ask[i].clear();
     }
    }

    int Book::copyChangedKehaiToString(char* dst) const
    {
     boost::mutex::scoped_lock lock(dataMutex);

     sprintf(dst, "%-4s%-13s",market.c_str(),meigara.c_str());
     int loc = 17;
     for(int i = 0; i < Book::NUM_KEHAI; ++i)
     {
      if(ask[i].changed > 0)
      {
       sprintf(dst+loc,"A%i%-21s%-21s%-21s%-8s%-4s",i,ask[i].price.c_str(),ask[i].volume.c_str(),ask[i].number.c_str(),ask[i].postTime.c_str(),ask[i].status.c_str());
       loc += 77;
      }
     }
     for(int i = 0; i < Book::NUM_KEHAI; ++i)
     {
      if(bid[i].changed > 0)
      {
       sprintf(dst+loc,"B%i%-21s%-21s%-21s%-8s%-4s",i,bid[i].price.c_str(),bid[i].volume.c_str(),bid[i].number.c_str(),bid[i].postTime.c_str(),bid[i].status.c_str());
       loc += 77;
      }
     } …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost valgrind

7
推荐指数
1
解决办法
2122
查看次数

C++ 模板函子(基于现代 C++ 设计)编译错误

基于《现代 C++ 设计》一书中的第 5 章(广义函子),

我正在尝试编写一个 Functor 模板。在问我“为什么我不直接使用 Boost 的绑定或 Loki 之前?” 简单的回答是“因为我想学习”。

话虽如此,我已经按照本书进行操作,并使用示例代码作为参考,但我不断提出编译时错误,我似乎无法理解为什么。

当我修改本书的示例代码以不使用线程模型时,示例工作正常。但我的代码没有。这是相关代码:

非常基本的 TypeList,以及 TypeAt 和 Nulltype、EmptyType(也基于本书)

<TypeList.hpp>
---
class NullType
{};

class EmptyType
{};

#define TYPELIST_1(T1) TypeList<T1, NullType>
#define TYPELIST_2(T1,T2) TypeList<T1, TYPELIST_1(T2) >
#define TYPELIST_3(T1,T2,T3) TypeList<T1, TYPELIST_2(T2, T3) >


template < typename T, typename U >
struct TypeList
{
typedef T Head;
typedef U Tail;
};


namespace typelist
{

template <class TList, unsigned int i > struct TypeAt;
template <class Head, class Tail >
struct TypeAt<TypeList<Head, …
Run Code Online (Sandbox Code Playgroud)

c++ templates functor

5
推荐指数
1
解决办法
1585
查看次数