所以我正在阅读作为即将推出的C++ 0x标准一部分的内存模型.但是,我对允许编译器做什么的一些限制有点困惑,特别是关于推测性加载和存储的限制.
首先,一些相关的东西:
Hans Boehm关于线程和C++ 0x中的内存模型的页面
Sutter,"Prism:基于原理的Microsoft本地代码平台的顺序存储模型",N2197
现在,基本思想本质上是"数据无竞赛程序的顺序一致性",这似乎是编程简易性和允许编译器和硬件优化机会之间的妥协.如果不对不同线程对相同存储器位置的两次访问进行排序,则至少有一个存储到存储器位置,并且它们中的至少一个不是同步动作,则定义数据争用.这意味着对共享数据的所有读/写访问必须通过某些同步机制,例如互斥体或对原子变量的操作(嗯,可以对原子变量进行操作,只为专家提供放松的内存排序,但默认提供为顺序一致).
鉴于此,我对普通共享变量上的虚假或推测性加载/存储的限制感到困惑.例如,在N2338中我们有例子
switch (y) {
case 0: x = 17; w = 1; break;
case 1: x = 17; w = 3; break;
case 2: w = 9; break;
case 3: x = 17; w = 1; break;
case 4: x = 17; w = 3; break;
case 5: x = 17; w = 9; break;
default: x = 17; w = 42; break;
}
Run Code Online (Sandbox Code Playgroud)
不允许编译器转换为
tmp = …Run Code Online (Sandbox Code Playgroud) 假设我有一个bash脚本,通过stdin获得一些输入.现在在该脚本中我想启动另一个进程并让该进程通过其stdin获取相同的数据.
#!/bin/bash
echo STDIN | somecommand
Run Code Online (Sandbox Code Playgroud)
现在上面的"回声STDIN"事情显然是假的,问题是如何做到这一点?我可以使用read从stdin中读取每一行,然后将其附加到临时文件中
cat my_temp_file | somecommand
Run Code Online (Sandbox Code Playgroud)
但这就是某种方式.
当前的C++ 0x草案在第29.3.9节和第293.10节,第1111-1112节中说明,在以下示例中:
// Thread 1
r1 = y.load(memory_order_relaxed);
x.store(1, memory_order_relaxed);
// Thread 2
r2 = x.load(memory_order_relaxed);
y.store(1, memory_order_relaxed);
Run Code Online (Sandbox Code Playgroud)
结果r1 = r2 = 1是可能的,因为每个线程的操作都是放松的,并且是不相关的地址.现在我的问题是关于以下(类似)示例的可能结果:
// Thread 1
r1 = y.load(memory_order_acquire);
x.store(1, memory_order_release);
// Thread 2
r2 = x.load(memory_order_acquire);
y.store(1, memory_order_release);
Run Code Online (Sandbox Code Playgroud)
我认为在这种情况下结果r1 = r2 = 1是不可能的.如果可能的话,y的负载将与商店同步(因此发生在之前).与x类似,x的加载将在商店到x之前发生.但是y的负载在存储到x之前(因此也发生在 - 之前)被排序.这创建了一个循环发生在之前的关系,我认为是不允许的.
我们在 pthread_once() 中使用任何锁定机制吗?在线程安全单例类中使用 pthread_once() 而不是使用 pthread_mutex_lock() 和 pthread_mutex_unlock() 的成本是多少?
我正在尝试使用matplotlib准备一些数据用于发布.为了使字体大小与原稿的文本相匹配,我试图以最终尺寸创建图形,以便在将其插入到手稿中时避免缩放图形.
我遇到的问题是,由于图形非常小,我可以缩放字体大小,轴大小,线宽等,但我一直无法弄清楚如何缩放虚线或虚线,如以及图例边框的厚度.有关简化且有些夸张的示例,请考虑
#!/usr/bin/python
small = True
from matplotlib import use
use('pdf')
from matplotlib import rc
rc('ps', usedistiller='xpdf')
rc('text', usetex=True)
if small:
figsize = (1.0, 0.5)
rc('font', size=2)
rc('axes', labelsize=2, linewidth=0.2)
rc('legend', fontsize=2, handlelength=10)
rc('xtick', labelsize=2)
rc('ytick', labelsize=2)
rc('lines', lw=0.2, mew=0.2)
rc('grid', linewidth=0.2)
else:
figsize = (8,8)
import numpy as np
x = np.arange(0, 10, 0.001)
y = np.sin(x)
import matplotlib.pyplot as plt
f = plt.figure(figsize=figsize)
a = f.add_subplot(111)
a.plot(x, y, '--', label='foo bar')
a.legend()
f.savefig('mplt.pdf')
Run Code Online (Sandbox Code Playgroud)
如果您更改第一个可执行行,small = False您可以看到它应该以"正常"大小显示.与正常尺寸相比,小图受到边框太厚的图例框的影响,并且虚线太粗糙,即破折号太长并且破折号之间的距离太长. …
所以numpy有一些方便的功能,可以将几个数组合成一个,例如hstack和vstack.我想知道是否有类似的东西,但对角堆叠组件数组?
假设我有N个形状的数组(n_i,m_i),我想将它们组合成一个大小的单个数组(sum_ {1,N} n_i,sum_ {1,N} m_i),这样组件数组就形成了块结果数组的对角线.
是的,我知道如何手动解决它,例如,如何将一个小的numpy数组"嵌入"一个大的numpy数组的预定义块中描述的方法?.只是想知道是否有更简单的方法.
啊,如何将块转换为块对角矩阵(NumPy)提到scipy.linalg.block_diag()是解决方案,除了我的工作站上安装的scipy版本太旧而没有它.还有其他想法吗?
像许多 emacs 用户一样,我有自己的 emacs 配置文件,~/.emacs.d/init.el用于按照我喜欢的方式配置 emacs。因此,当我开始使用新机器时,我会将 emacs 配置文件复制到其中。现在的问题是我的 emacs 配置文件依赖于我通过 emacs 包管理器安装的一些包,但由于缺少包,我无法成功安装包。
我当然可以在没有配置文件 ( emacs -q) 的情况下启动 emacs,但问题是只有默认存储库可用,所以我实际上无法安装我需要安装的包才能使用我的配置文件成功启动 emacs。
所以我通常做的就是暂时注释掉我的 emacs 配置文件中的内容,以便我能够成功安装软件包,然后我可以取消注释并使用完整配置重新启动 emacs。但这很麻烦,通常需要尝试几次才能注释掉所有需要的东西。当然一定有我缺少的更好的方法吗?
当我使用 gfortran -g -fbacktrace -ffpe-trap=invalid,overflow,underflow File.f90 编译我的代码时,我收到以下错误:
Program received signal SIGFPE : Floating - Point exception - erroneous arithmetic operation.
Backtrace for this error:
#0 0x7f3da0768ed7 in ???
#1 0x7f3da076810d in ???
#2 0x7f3d9fe9b7ef in ???
#3 0x7f3da0230a3e in ???
Run Code Online (Sandbox Code Playgroud)
我的问题是:我如何解释这些数字和 ??? 在“此错误的回溯:”下。如何使用此错误消息来帮助我查找错误?它们是否与有问题的特定代码行有某种关系?如果是这样,如何?
到目前为止,我意识到我有一个错误的算术运算错误,但我不知道在哪里,这个回溯错误消息根本没有帮助。如果我只使用 gfortran File.f90 进行编译,则在编译或运行期间根本没有错误消息。
因此,我听说过现代C++风格的一个经验法则是,不应该使用new或delete,而应该使用智能指针.所以当我有一个类,其中一个成员是指向另一个对象的指针时,如何去做.通过使用智能指针我可以避免删除,但我仍然需要用new创建对象.例如,下面是"规范"的现代C++风格,或者应该怎么做呢?
#include
#include
class B {
public:
B () { std::printf("constructing B\n");}
~B () { std::printf("destroying B\n");}
};
class A {
public:
A ()
{
std::printf("constructing A\n");
b = std::unique_ptr(new B());
}
~A () { std::printf("destroying A\n");}
private:
std::unique_ptr b;
};
int main()
{
A a;
return 0;
}
我想对列表中的每个元素应用一个 ansible 过滤器,然后从中创建一个字符串。假设我有一个清单
my_files:
- /etc/passwd
- /etc/group
Run Code Online (Sandbox Code Playgroud)
然后在 ansible 任务中我想创建一个像“passwd,group”这样的字符串。如果没有过滤,可以使用 jinja 语法来完成
{{ ",".join(my_files) }}
Run Code Online (Sandbox Code Playgroud)
这将创建一个字符串“/etc/passwd,/etc/group”。但现在我想将 ansible 基本名称过滤器应用于每个元素。对于标量,其工作原理如下
{{ /etc/passwd | basename }}
Run Code Online (Sandbox Code Playgroud)
这将生成字符串“passwd”。那么问题是,如何组合这两个操作来从列表 my_files 中生成字符串“passwd,group”?
c++ ×3
c++11 ×2
memory-model ×2
python ×2
ansible ×1
bash ×1
concurrency ×1
emacs ×1
fortran ×1
gfortran ×1
installation ×1
jinja2 ×1
matplotlib ×1
numpy ×1
pipe ×1
plot ×1
posix ×1
pthreads ×1
raii ×1
startup ×1