是否可以获取atomic_int的底层存储的地址?

时间:2014-01-14 01:11:42

标签: c++ linux multithreading c++11 atomic

我想在std::atomic_int linux函数中使用futex

但是,futex函数需要一个地址位置,而且我不确定仅仅使用atomic_int对象的地址的正确性。

因此,我想知道是否有可能获得atomic_int的基础存储地址,因此我可以将其传递给futex来电。

2 个答案:

答案 0 :(得分:1)

Portly,没有。实际上,在任何现代C ++实现中,atomic_int可能只是sizeof(int)个字节的内存,就像常规int一样。如果是sizeof(std::atomic<int>) == sizeof(int),请选择已损坏并将其地址传递给futex,看看会发生什么。

答案 1 :(得分:1)

也许不是。

在手册中

int futex(int *uaddr, int op, int val, const struct timespec *timeout,
    int *uaddr2, int val3);

The uaddr argument needs to point to an aligned integer which stores the counter.  The operation to execute  is  passed via the op argument, along with a value val.

您的atomic_int应该对齐。

在gcc 4.7.2(在Fedora 18上),文件:/usr/include/c++/4.7.2/bits/atomic_base.h

// Base types for atomics.
template<typename _IntTp>
  struct __atomic_base;
...
/// atomic_int
typedef __atomic_base<int>                    atomic_int;
...
template<typename _ITp>
struct __atomic_base
{
private:
  typedef _ITp      __int_type;

  __int_type        _M_i;

// some operations
...

atomic_int只是数据__int_type _M_i;的包装,其中__int_type是您传入的模板参数。所以它是一个整数。并且结构不能保证在跨平台中对齐。