小编alk*_*edr的帖子

两个std :: atomic可以成为一个联盟的一部分吗?

我想做这个:

union {
    std::atomic<uint128_t> u128;
    struct {
        std::atomic<uint64_t> u64_1;
        std::atomic<uint64_t> u64_2;
    };
};
Run Code Online (Sandbox Code Playgroud)

几个线程将读取和写入联合的两个部分.

安全吗?

编辑:我使用Linux,x86_64,clang 3.3

Edit2:我希望能够递增和递减u64_1,读取u64_2,并写入u128(compare_exchange)

Edit3:如果我使用原子内置函数怎么办?工会将如下所示:

union {
    uint128_t u128;
    struct {
        uint64_t u64_1;
        uint64_t u64_2;
    };
};
Run Code Online (Sandbox Code Playgroud)

u64_1将映射到u128的上半部分,u64_2将映射到下半部分.

c++ atomic c++11

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

如何编写一个在java中采用相同类型的两个参数的泛型方法?

当我注意到以下代码编译时没有警告和打印时,我感到非常惊讶Integer / String:

public final class GenericsTest {
    private static <T> void method(T arg1, T arg2) {
        System.out.println(arg1.getClass().getSimpleName());
        System.out.println(arg2.getClass().getSimpleName());
    }

    public static void main(String[] args) {
        method(1, "1");
    }
}
Run Code Online (Sandbox Code Playgroud)

我预计会出现编译错误.

这段代码编译的原因是什么?

确保参数具有相同类型的正确方法是什么?

编辑:有界类型参数怎么样?我能想到的最好的是:

private static <T, U extends T> void method(T arg1, U arg2) {
    System.out.println(arg1.getClass().getSimpleName());
    System.out.println(arg2.getClass().getSimpleName());
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,java不允许循环约束.<T extends U, U extends T>不编译.这是死路一条吗?

java generics

8
推荐指数
2
解决办法
2076
查看次数

我可以同时从多个线程调用一个套接字的accept()吗?

我使用的是Linux 3.2.0,x86_64.我可以同时从多个线程调用一个套接字的accept()吗?

sockets linux multithreading posix pthreads

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

如何保持Qt5中小部件的特定高宽比?

我尝试了覆盖方法hasHeightToWidth()和heightToWidth(),但是由于某些原因,该方法不起作用。有没有可以使用的完整示例?

Upd1:

class MyWidget : public QWidget {
    Q_OBJECT

public: 
    MyWidget() {
        QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
        sizePolicy.setHeightForWidth(true);
        setSizePolicy(sizePolicy);
    }
    bool hasHeightForWidth() const override {
        std::cout << __FUNCTION__ << std::endl;
        return true;
    }
    int heightForWidth(int w) const override {
        std::cout << __FUNCTION__ << " " << w << std::endl;
        return w;
    }
    QSize sizeHint() const override {
        return QSize(100, heightForWidth(100));
    }
};
Run Code Online (Sandbox Code Playgroud)

MyWidget实例将插入QHBoxLayout中。

我用的是qt5。

调试std :: cout的演示hasHeightForWidth和heightForWidth被多次调用

c++ qt qt5

5
推荐指数
0
解决办法
1065
查看次数

Linux上系统调用参数的类型是什么?

我想写一个执行系统调用的泛型函数.就像是

long my_syscall2(long number, long arg1, long arg2);
Run Code Online (Sandbox Code Playgroud)

我希望它尽可能便携.对于所有体系结构,实现明显不同.功能的签名是否也需要不同?我可以使用long或者我应该使用其他东西吗?

以下是我找到的可能的解决方案:

  • 内核使用了一些黑魔法 :( __SYSCALL_DEFINEx调用__SC_LONG来获取类型,__SC_LONG包含魔法).我听说用户空间中的类型并不总是与内核空间中的类型相同,所以我不知道是否可以使用它.
  • 除了x32之外, musl-libc 对它支持的所有体系结构使用long :(在[arch] /syscall_arch.h中定义).
  • 我可以找到我想要支持的所有处理器体系结构和编译器的文档,查找寄存器大小和整数类型大小,并选择与寄存器大小相同的任何整数类型.

所以我想问题是"是否有一些规则说'系统调用参数的类型总是long有一些像x32这样的例外',或者我是否需要查找每个架构和编译器的文档?"

编辑:我知道一些系统调用将指针和其他类型作为参数.我想编写可以调用任何系统调用的泛型函数,使用泛型参数类型.这些通用参数类型应足够大,以容纳任何实际参数类型.我知道这是可能的,因为syscall()函数存在.

Edit2:这是此问题的另一个部分解决方案.

这些功能的实现目前如下所示:

static __inline long my_syscall2(long number, long arg1, long arg2)
{
    unsigned long ret;
    __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(number), "D"(arg1), "S"(arg2)
                      : "rcx", "r11", "memory");
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

有趣的是"=a"(ret),这意味着存储在寄存器中的系统调用返回值a应该保存到变量中ret.使用syscall而不是编写创建局部变量的函数,而是将其返回值保存到变量中并返回变量,我可以编写一个宏来进行系统调用并将结果存储到调用者提供的变量中.它看起来像这样:

#define my_syscall2(RET, NUMBER, ARG1, ARG2) \
  __asm__ __volatile__ ("syscall" : "=a"(RET) : …
Run Code Online (Sandbox Code Playgroud)

c system-calls linux-kernel

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

如何在C++中以原子方式添加和获取128位数字?

我使用Linux x86_64和clang 3.3.

这在理论上是否可行?

std::atomic<__int128_t> 不起作用(对某些函数的未定义引用).

__atomic_add_fetch 也行不通('错误:无法编译这个原子库调用').

两者std::atomic__atomic_add_fetch用64位数字的工作.

c++ atomic

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

当另一个线程等待这个 epoll 描述符时,我可以将套接字添加到 epoll 描述符吗?

我有几个线程,其中一个epoll_wait在循环中调用,其他线程可以打开需要epoll由第一个线程处理的连接。是否可以epoll_ctl在另一个线程等待时添加新套接字epoll_wait

在以下场景中会发生什么:

  1. 线程 1 调用 epoll_wait。
  2. 线程 2 创建一个 socket(A) 并使用 epoll_ctl 将其添加到 epoll 实例中。
  3. 有人发送了一些数据,套接字 A 准备好进行 read() 调用。

epoll_wait 会返回套接字 A 吗?

sockets multithreading epoll

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

标签 统计

c++ ×3

atomic ×2

multithreading ×2

sockets ×2

c ×1

c++11 ×1

epoll ×1

generics ×1

java ×1

linux ×1

linux-kernel ×1

posix ×1

pthreads ×1

qt ×1

qt5 ×1

system-calls ×1