小编mik*_*och的帖子

函数调用是现代平台的有效内存障碍吗?

在我评论的代码库中,我发现了以下习语.

void notify(struct actor_t act) {
    write(act.pipe, "M", 1);
}
// thread A sending data to thread B
void send(byte *data) {
    global.data = data;
    notify(threadB);
}
// in thread B event loop
read(this.sock, &cmd, 1);
switch (cmd) {
    case 'M': use_data(global.data);break;
    ...
}
Run Code Online (Sandbox Code Playgroud)

"抓住它",我对作者说,我的团队的一名高级成员,"这里没有内存障碍!你不能保证global.data将从缓存刷新到主内存.如果线程A和线程B将运行两个不同的处理器 - 这个方案可能会失败".

高级程序员咧嘴一笑,慢慢解释,仿佛在解释他五岁的男孩如何系鞋带:"听小男孩,我们在这里看到很多线程相关的错误,在高负载测试中,在真实客户中",他他停下来留下他长长的胡须,"但我们从来没有这个成语的错误".

"但是,它在书中说......"

"安静!",他立刻叫醒我,"也许理论上,它不能保证,但实际上,你使用函数调用的事实实际上是一个内存屏障.编译器不会重新排序指令global.data = data,因为它无法知道是否任何人在函数调用中使用它,并且x86架构将确保其他CPU在线程B从管道读取命令时将看到这段全局数据.请放心,我们有充足的现实问题需要担心.我们不需要在虚假的理论问题上投入额外的努力.

"请放心,我的孩子,你会理解将真正的问题与我需要获得博士的非问题分开."

他是对的吗?这在实践中真的不是问题(比如x86,x64和ARM)吗?

这是我所学到的一切,但他确实有一个长胡子和一个非常聪明的外观!

额外的积分如果你能告诉我一段代码证明他错了!

c multithreading memory-barriers

66
推荐指数
2
解决办法
4757
查看次数

使用gcc在C语言中键入varargs

很多时候我想要一个函数来接收可变数量的参数,例如以NULL结尾

#define push(stack_t stack, ...) _push(__VARARG__, NULL);
func _push(stack_t stack, char *s, ...) {
    va_list args;
    va_start(args, s);
    while (s = va_arg(args, char*)) push_single(stack, s);
}
Run Code Online (Sandbox Code Playgroud)

如果foo收到非char*变量,我可以指示gcc或clang发出警告吗?类似的东西__attribute__(format),但是对于同一指针类型的多个参数.

c gcc static-analysis c89

20
推荐指数
1
解决办法
1373
查看次数

获得clang的AST背后的来源

给定clang中的AST对象,我如何获得它背后的代码?我尝试编辑教程中的代码,并添加:

clang::SourceLocation _b = d->getLocStart(), _e = d->getLocEnd();
char *b = sourceManager->getCharacterData(_b),
      e = sourceManager->getCharacterData(_E);
llvm:errs() << std::string(b, e-b) << "\n";
Run Code Online (Sandbox Code Playgroud)

但是,它没有打印整个typedef声明,只有大约一半!打印时也会出现同样的现象Expr.

如何打印并查看构成声明的整个原始字符串?

c++ clang

17
推荐指数
3
解决办法
5337
查看次数

在CDT之外使用Eclipse CDT解析器

是否可以在Eclipse之外使用Eclipse的CDT解析器来离线分析C源?

c eclipse parsing eclipse-cdt

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

加速多个模块的maven组装

我有一个以下形式的项目

- pom.xml
- projectA
  - pom.xml
  - src/main/
    - java
    - startupScript
- projectB
  - pom.xml
  - src/main/
    - java
    - startupScript
- projectAssembly
  - pom.xml
Run Code Online (Sandbox Code Playgroud)

我想projectAssembly生成一个tar.gz,它包含两个文件夹,一个用于projectA,一个用于projectB,在每个文件夹中,都有项目的依赖项和startupScript库.

"天真"的方法是将assembly.xml文件添加到每个项目中,文件大致如下:

<assembly>
<formats>
    <format>tar.gz</format>
</formats>
<baseDirectory>/${project.artifactId}</baseDirectory>
<fileSets>
    <fileSet>
        <directory>${basedir}/src/main/startupScripts</directory>
        <outputDirectory>/startupScripts</outputDirectory>
    </fileSet>
 </fileSets>
<dependencySets>
    <dependencySet>
        <outputDirectory>/lib</outputDirectory>
    </dependencySet>
</dependencySets>
</assembly>
Run Code Online (Sandbox Code Playgroud)

然后,在projectAssembly,取决于<type>tar.gz</type>两者projectAprojectB,并添加一个大致看起来像的汇编文件

<assembly>
<dependencySets>
    <dependencySet>
        <outputDirectory>/</outputDirectory>
        <unpack>true</unpack>
    </dependencySet>
</dependencySets>
</assembly>
Run Code Online (Sandbox Code Playgroud)

这工作,但是,我并不需要中间tar.gz的项目AB,以及生产它们,特别是如果他们有很大的依赖性,需要很长的时间.

我如何告诉maven直接装配tar.gz projectAssembly而不浪费时间打包和拆包中间档案?

maven maven-assembly-plugin

7
推荐指数
1
解决办法
604
查看次数

为什么锁定被捕获到局部变量

在java JRE中我看到了代码

private final ReentrantLock lock;
public E poll() {
        final ReentrantLock lock = this.lock;
        lock.lock();
Run Code Online (Sandbox Code Playgroud)

为什么锁定被捕获到私有变量?我希望简单

public E poll() {
        lock.lock();
Run Code Online (Sandbox Code Playgroud)

java reentrantlock

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

解析 C 文件而不进行预处理

我想对 C 文件运行简单分析(例如,如果您使用参数调用fooINT_TYPE,然后将响应转换为int*),我不想预处理该文件,我只想解析它(这样,例如,我将有正确的行号)。

即,我想从

#include <a.h>

#define FOO(f)

int f() {FOO(1);}
Run Code Online (Sandbox Code Playgroud)

令牌列表,例如

<include_directive value="a.h"/>
<macro name="FOO"><param name="f"/><result/></macro>
<function name="f">
    <return>int</return>
    <body>
        <macro_call name="FOO"><param>1</param></macro_call>
    </body>
</function>
Run Code Online (Sandbox Code Playgroud)

无需设置包含路径等。

是否有任何预先存在的解析器可以做到这一点?我所知道的所有解析器都假设 C 是经过预处理的。我想访问宏和实际的包含指令。

c parsing

5
推荐指数
1
解决办法
959
查看次数

让gcc警告隐式转换

可能重复:
我可以让GCC在向函数传递过多类型时发出警告吗?

很多时候我通过传递long到整数函数来导致错误.

当我这样做时,我可以让gcc警告我吗?

c gcc warnings

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