小编ton*_*sdg的帖子

强制64位长双打?

我正在musl-libcaarch64(ARM 64位)平台上的项目静态构建.我想避免使用任何软浮点库,例如GCC的软浮点库例程.但是,即使我使用它们,它们仍然出现在库档案中-mfloat-abi=hard.我可以说,这是因为ARM 64位平台将a定义long double为128位.

有没有办法改变这种行为?例如,我可以强制long double定义为与double?相同的大小吗?我知道这是C标准所允许的,但我不确定是否有任何方法可以强制Clang(我特意使用Clang)来编译这样的定义.

c floating-point clang arm64 musl

16
推荐指数
1
解决办法
782
查看次数

为什么sigwait()MT安全,但sigsuspend()不是安全的?

我正在寻找一个多线程应用程序,其中一个线程在继续之前等待另一个线程发出信号。据这里sigsuspend是不是线程安全的,因为争用条件。根据这里sigwait在这些情况下应使用。我想了解原因。

根据手册页描述(sigwaitsigsuspend),似乎...

sigsuspend (const sigset_t *mask)实际上会更改进程的信号掩码,这会影响所有线程。

sigwait (const sigset_t *set, int *sig)只需等待指示的信号之一,set 而无需更改线程(或进程)的信号掩码。

这种理解正确吗?如果是这样,如何在sigwait不更改信号掩码的情况下进行阻塞?

c linux multithreading

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

如何防止 ld 添加 .note.gnu.property?

我有一个玩具x86汇编程序,我正在写,用编译asld

.text

    .global _start

_start:
    movq    $1, %rax
    movq    $0x7FFFFFFF, %rbx
L1:
    cmp     %rbx, %rax          
    je      L2
    addq    $1, %rax
    jmp     L1
L2:

    movq    %rax, %rbx
    movq    $1, %rax
    int     $0x80
Run Code Online (Sandbox Code Playgroud)

然后构建:

as -o test.o test.S
ld -s -o test test.o
Run Code Online (Sandbox Code Playgroud)

这的第二步 -- ld-- 生成一个附加注释:

$ objdump -D test

test:     file format elf64-x86-64


Disassembly of section .note.gnu.property:

00000000004000e8 <.note.gnu.property>:
  4000e8:       04 00                   add    $0x0,%al
  4000ea:       00 00                   add    %al,(%rax)
  4000ec:       10 00                   adc    %al,(%rax)
  4000ee: …
Run Code Online (Sandbox Code Playgroud)

ld

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

你能为Python类定义多个不同的迭代器吗?

我正在写一个非常简单的Tree类:

class Tree:
    def __init__(self, value_ = None, children_ = None):
        self.value = value_
        self.children = children_
Run Code Online (Sandbox Code Playgroud)

我希望能够通过一个简单的循环执行DFS和BFS遍历,即:

t = Tree()
# ...fill tree...

for node in t:
    print(node.value)
Run Code Online (Sandbox Code Playgroud)

例如,在C++中,您可以拥有多种类型的迭代器 - 因此我可以定义DFS和BFS迭代器,并根据我想要执行的遍历类型使用其中一种.这可以用Python做吗?

python python-2.7

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

格式化更新是一个无聊的Git提交吗?

我有一个我正在研究的Python项目.我一直在研究两种不同的机器,我最近发现我的一半文件使用了标签,另一半使用了空格.

当我试图在另一台机器上编辑和运行文件时,Python反对这一点,所以我想将所有内容切换到空格而不是标签.然而,这似乎浪费了Git提交 - 在未提交但正确的文件上运行'git diff'使它看起来像我正在消灭并替换整个文件.

有没有解决的办法?也就是说,有什么方法可以"隐藏"这些(IMO)无聊的变化吗?

python git

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

是否可以使用黄金链接器编译和链接Clang/LLVM?

我正在为LLVM/Clang编写自定义传递,重新编译往往需要一段时间并使用大量内存.我听说黄金链接器(1)花费的时间更少,(2)使用的内存比标准的ld链接器少.

有没有办法将标志传递到LLVM/Clang构建过程并更改为黄金链接器?根据这个答案,我一直在尝试使用覆盖文件,但我似乎没有取得很大的成功.

我还要注意到我正在使用Clang 3.9编译最新的Clang/LLVM版本(4.0); 如果有必要,我不介意切换回GCC,而是宁愿避免它.

cmake llvm clang llvm-clang gold-linker

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

锁定 OMP 区域

我正在尝试在我的应用程序中检测一些功能,看看它们需要多长时间。我使用链接列表将所有时间记录在内存中。

在此过程中,我引入了一个全局变量来跟踪列表的末尾。当我输入新的计时区域时,我会在列表末尾插入一条新记录。相当简单的东西。

然而,我想要跟踪的一些函数是在 OpenMP 区域中调用的。这意味着它们可能会被并行调用多次。这就是我被难住的地方。

如果这是使用普通的 Pthreads,我只需将对全局变量的访问包装在互斥体中,然后就到此为止了。但是,我不确定:此策略是否仍适用于 OpenMP 区域中调用的函数?比如,他们会尊重锁吗?

例如(不会编译,但我认为明白了这一点):

Record *head;
Record *tail;

void start_timing(char *name) {
    Record *r = create_record(name);
    tail->next_record = r;
    tail = r;
    return r;
}

int foo(void) {
   Record r = start_timing("foo");
   //Do something...
   stop_timing(r);
}

int main(void) {
   Record r = start_timing("main");
   //Do something...
   #pragma omp parallel for...
   for (int i = 0; i < 42; i++) {
       foo();
   }
   //Do some more...
   stop_timing(r);
}
Run Code Online (Sandbox Code Playgroud)

然后我将更新为:

void start_timing(char *name) {
    Record *r = …
Run Code Online (Sandbox Code Playgroud)

c multithreading locking openmp

2
推荐指数
1
解决办法
1555
查看次数

控制语句'if((i + j)&1)'背后的逻辑是什么?

该程序声明一个8x8字符数组,然后使用循环将以下数据存储到数组中(每个数组元素一个字符).然后它将此数组打印到屏幕:

BRBRBRBR

RBRBRBRB

BRBRBRBR

RBRBRBRB

BRBRBRBR

RBRBRBRB

BRBRBRBR

RBRBRBRB

该程序工作正常.但是,我无法理解if语句背后的逻辑:

if((i+j) & 1)
Run Code Online (Sandbox Code Playgroud)

我不明白如果添加i + j'和'1是真的设置数组到'R',否则将其设置为'B'.这可能有一个相当明显的答案,但我是C的新手.有人可以帮助澄清为什么这个程序适用于这个逻辑?谢谢!

#include <stdio.h>
#include <stdlib.h>


int main(void)
{
    int i, j;
    char letter[8][8];
    for(i=0; i<8; i++) {
        for(j=0; j<8; j++) {
            //This if-statement
            if ((i+j) & 1)
                letter[i][j] = 'R';
            else 
                letter[i][j] = 'B';
            printf("%c" , letter[i][j]);
        }
        printf("\n");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c arrays char

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