小编exc*_*bur的帖子

对共享内存的原子访问

我在多个进程之间有一个共享内存,以某种方式插入内存.例如:

DataBlock {
int counter;
double value1;
double ...    }
Run Code Online (Sandbox Code Playgroud)

我想要的是计数器以原子方式更新/递增.并且在该地址上发生内存释放.例如,如果我不使用共享内存,那就像是

std::atomic<int> counter;
atomic_store(counter, newvalue, std::memory_order_release); // perform release     operation on the affected memory location making the write visible to other threads
Run Code Online (Sandbox Code Playgroud)

如何为随机存储器位置(解释为DataBlock计数器>上面)实现此目的.我可以保证地址符合架构的要求(x86 linux)

  1. 使更新成为原子 - 如何?(即atomicupdate(addr,newvalue))
  2. 多核的内存同步 - (即memorysync(addr)) - 我唯一能看到的方法是使用std :: atomic_thread_fence(std :: memory_order_release) - 但这将"建立所有原子和放松原子存储的内存同步排序" - 那就是对我来说太过分了 - 我只想让计数器位置同步.欣赏任何想法.

c++ linux atomic memory-fences c++11

9
推荐指数
2
解决办法
9649
查看次数

未定义引用`vtable for a template

我有一个模板类,它继承自接口类,因此具有虚函数

//abstract.h
class Abstract {
virtual void abc();
Abstract();
}
//Abstract.cpp
Abstract::Abstract()
{ //do some init}

//concrete.h
class Impl {
public:
    void abcImpl();
};

template<typename T>
class Concrete : public Abstract, public T {
virtual void abc();
};
template<typename T>
Concrete<t>::abc()  { static_cast<T>(*this).abcImpl(); }

//concrete.cpp
void Impl::abc() { std::cout << "abc"; }
Run Code Online (Sandbox Code Playgroud)

在这里使用

//foo.cpp
Concrete<Impl> *var1 = new Concrete<Impl>();
Run Code Online (Sandbox Code Playgroud)

在链接时,我得到一个错误未定义的引用`vtable for Abstract'

在过去,此错误表明编译器无法找到放置vtable的位置,因为没有与该类关联的cpp文件.换句话说,它将vtable放在首先找到任何成员函数的第一个非虚拟定义的位置.但这令人费解,因为.1.我不知道为什么它抱怨抽象 - 抽象实际上有一个cpp 2.也许错误消息实际上意味着具体?但是Concrete不能在cpp文件中因为它的模板化.那么在处理同样具有虚函数的模板类时,一般如何解决这个问题呢?

c++ virtual templates

6
推荐指数
1
解决办法
1608
查看次数

套接字keepalive无法正常工作

我有一个客户端connect()到服务器,当空闲时,它会在几个小时后超时.我在1秒内添加了setsockopt(套接字,SOL_SOCKET,SO_KEEPALIVE ...),但它并没有什么区别.为什么keepalive不起作用的任何线索?如果我使用SOL_TCP而不是SOL_SOCKET会有所不同吗?这是在Linux上.

c++ sockets linux tcp

6
推荐指数
1
解决办法
8429
查看次数

C++ 11原子x86内存排序

在C++ 0x中的一个原子变量文档中,当描述内存顺序时,它提到:

发布 - 获取订购

在强排序系统(x86,SPARC,IBM大型机)上,发布 - 获取顺序是自动的.没有为此同步模式发出额外的CPU指令,只会影响某些编译器优化...

首先是真的,x86遵循严格的内存排序?似乎效率非常低,总是强加于此.意味着每次写入和读取都有围栏?

另外,如果我在x86系统上有一个对齐的int,原子变量是否可以用于任何目的?

c++ atomic c++11

5
推荐指数
2
解决办法
1867
查看次数

C++模板化虚函数

C++不支持模板化的虚拟成员函数,但我有一个理想的场景.我想知道是否有人有想法如何实现这一目标.

#include <iostream>


class Foo {
public:
    virtual void bar(int ){}
    // make a clone of my existing data, but with a different policy
    virtual Foo* cloneforDB() = 0;
};


struct DiskStorage {
    static void store(int x) { std::cout << "DiskStorage:" << x << "\n"; }
};

struct DBStorage {
    static void store(int x) { std::cout << "DBStorage:" << x << "\n"; }
};

template<typename Storage>
class FooImpl : public Foo {
public:
    FooImpl():m_value(0) {}
    template<typename DiffStorage>
    FooImpl(const FooImpl<DiffStorage>& copyfrom) …
Run Code Online (Sandbox Code Playgroud)

c++

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

C++原子增量内存排序

在C++ 11中:如果我增加一个原子变量(std :: atomic上的operator ++),新值是否与内存屏障一起存储?或者我必须明确地做商店?

c++ atomic c++11

3
推荐指数
1
解决办法
607
查看次数

内核模式抢占

我理解新的Linux内核允许内核空间线程被抢先一步.有人可以简要解释在内核模式下执行时抢占是如何工作的吗?因此,当进行系统调用时,软件中断会将线程切换到内核模式,并且它将运行必要的内容.现在,让我们说它的时间片是 - 并且另一个用户线程运行,它也想在内核空间中执行.(或者它可能是啊/ w中断).当内核中断时,内核如何维护它为T1修改的任何结构的完整性?

linux operating-system linux-kernel

3
推荐指数
1
解决办法
634
查看次数

C++模板参数作为基类

为什么派生类在被模板化时不被允许访问其受保护的基类成员?

class MyBase {
protected:
    int foo;
};

template<typename Impl>
class Derived : public Impl {
public:
    int getfoo() {
            return static_cast<Impl*>(this)->foo;
    }
};
Run Code Online (Sandbox Code Playgroud)

编译器抱怨foo受到保护.为什么?

error: int MyBase::foo is protected
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

C++干净的指针算术

什么是在C++中执行指针运算最干净的方法?我正在尝试将n字节添加到地址.

int *foo;
foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T))
Run Code Online (Sandbox Code Playgroud)

之后你可以重铸并以不同的方式使用foo

char* somestr = reinterpret_cast<char*>(foo)
Run Code Online (Sandbox Code Playgroud)

这够好吗?现在我理解指针实现dosent保证所有指针(char*,int*)都实现相同的大小.所以不确定是否int*(应该是foo*)并且使用unsigned int进行数学运算是最干净的解决方案.此外,它必须兼容32位和64位.

没关系为什么我这样做.虽然不是那么不寻常.当您使用动态解释为不同类型的数据流(或字节池)时,您将遇到此问题.

c++ linux pointers

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

具有多个派生的Java泛型

我对java很新,对这种行为有点困惑

public class MyBase<T> {
static int id;
}

public class DerA extends MyBase<DerA> {
}

public class DerB extends MyBase<DerB> {
}
Run Code Online (Sandbox Code Playgroud)

我期望DerA.idDerid成为两个不同的static变量.但似乎是在分享同一个!这种行为对我来说毫无意义 - 它有两种不同的类型.

java static

0
推荐指数
1
解决办法
56
查看次数