posix标准说像mutex这样的东西会强制执行内存同步.但是,编译器可能会重新排序内存访问.说我们有
lock(mutex);
setdata(0);
ready = 1;
unlock(mutex);
Run Code Online (Sandbox Code Playgroud)
可能会通过编译器重新排序将其更改为下面的代码,对吗?
ready = 1;
lock(mutex);
setdata(0);
unlock(mutex);
Run Code Online (Sandbox Code Playgroud)
那么互斥量如何同步内存访问?更确切地说,编译器如何知道重锁不应该在锁定/解锁时发生?
实际上这里对于单线程方面,就绪分配重新排序是完全安全的,因为就绪不用于函数调用锁(mutex).
编辑:因此,如果函数调用是编译器无法解决的问题,我们可以将其视为编译器内存屏障
asm volatile("" ::: "memory")
Run Code Online (Sandbox Code Playgroud) 更具体:
我正在实现一个Query系统.我实现了不需要的功能.现在用户询问在单个select语句中使用多个unfst.我使用PostgreSQL作为指南,因为大多数用户在我们的查询系统之前使用它.
PostgreSQL有这样奇怪的行为:
postgres=# select unnest(array[1,2]), unnest(array[1,2]);
unnest | unnest
--------+--------
1 | 1
2 | 2
(2 rows)
postgres=# select unnest(array[1,2]), unnest(array[1,2,3]);
unnest | unnest
--------+--------
1 | 1
2 | 2
1 | 3
2 | 1
1 | 2
2 | 3
(6 rows)
Run Code Online (Sandbox Code Playgroud)
我的实现总是生成笛卡尔积.我想知道,这背后的正确逻辑是什么?PostgreSQL正在做正确的事还是只是一个bug?我没有在ANSI文档或PostgreSQL文档中找到明确的描述.
我们的项目就像适用于大量不同其他库的适配器/外观接口.依赖关系以某种方式重叠,有时会发生冲突,有时甚至会使项目中断,因为错误版本的依赖项会提供相同接口的错误行为.我们使用Ivy和Ant来进行基本的依赖关系管理.在早期管理依赖关系和检测错误行为的最佳做法是什么?