我想做这个:
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将映射到下半部分.
当我注意到以下代码编译时没有警告和打印时,我感到非常惊讶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>不编译.这是死路一条吗?
我使用的是Linux 3.2.0,x86_64.我可以同时从多个线程调用一个套接字的accept()吗?
我尝试了覆盖方法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被多次调用
我想写一个执行系统调用的泛型函数.就像是
long my_syscall2(long number, long arg1, long arg2);
Run Code Online (Sandbox Code Playgroud)
我希望它尽可能便携.对于所有体系结构,实现明显不同.功能的签名是否也需要不同?我可以使用long或者我应该使用其他东西吗?
以下是我找到的可能的解决方案:
所以我想问题是"是否有一些规则说'系统调用参数的类型总是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) 我使用Linux x86_64和clang 3.3.
这在理论上是否可行?
std::atomic<__int128_t> 不起作用(对某些函数的未定义引用).
__atomic_add_fetch 也行不通('错误:无法编译这个原子库调用').
两者std::atomic并__atomic_add_fetch用64位数字的工作.
我有几个线程,其中一个epoll_wait在循环中调用,其他线程可以打开需要epoll由第一个线程处理的连接。是否可以epoll_ctl在另一个线程等待时添加新套接字epoll_wait?
在以下场景中会发生什么:
epoll_wait 会返回套接字 A 吗?