小编比尔盖*_*尔盖子的帖子

为什么父进程中的 printf() 在 fork() 之后几乎总是赢得竞争条件?

有一个有点著名的 Unix 脑筋急转弯:写一个if表达式,使下面的程序打印Hello, world!在屏幕上。该exprif必须是合法的C表达式,不应包含其他的程序结构。

if (expr)
    printf("Hello, ");
else
    printf("world!\n");
Run Code Online (Sandbox Code Playgroud)

答案是fork()

当我年轻的时候,我只是笑了笑,忘记了。但是重新思考它,我发现我无法理解为什么这个程序比它应该的可靠得惊人。之后的执行顺序fork()无法保证并且存在竞争条件,但在实践中,您几乎总是看到Hello, world!\n,从不world!\nHello,

为了证明这一点,我运行了 100,000 轮程序。

for i in {0..100000}; do
    ./fork >> log
done
Run Code Online (Sandbox Code Playgroud)

在 Linux 5.9 (Fedora 32, gcc 10.2.1, -O2) 上,执行 100001 次后,子只赢了 146 次,父赢率为 99.9985%。

$ uname -a
Linux openwork 5.9.14-1.qubes.x86_64 #1 SMP Tue Dec 15 17:29:47 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ wc -l log
100001 log …
Run Code Online (Sandbox Code Playgroud)

c unix fork race-condition

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

如何使用Python和PyQt对我的GUI程序进行单元测试?

我听说单元测试是保持代码正常工作的好方法.

单元测试通常会对函数进行简单输入,并检查其简单输出.但是我该如何测试用户界面呢?

我的程序是用PyQt编写的.我应该选择PyUnit,还是Qt的内置QTest?

python qt unit-testing pyqt

19
推荐指数
2
解决办法
7628
查看次数

计算时避免溢出?通过使用16位算术评估系列?

我正在尝试编写一个计算十进制数字的程序?到1000位数或更多。

为了有趣地进行低级编程,最终程序将以汇编形式编写在没有乘法或除法且仅执行16位加法的8位CPU上。为了简化实现,希望只能使用16位无符号整数运算,并使用迭代算法。速度不是主要问题。快速乘法和除法不在此问题的范围内,因此也不要考虑这些问题。

在进行汇编之前,我仍在尝试在台式计算机上的C语言中找到可用的算法。到目前为止,我发现以下系列相当有效并且相对容易实现。

该公式是使用收敛加速技术从Leibniz系列推导而来的,要推导该公式,请参见Carl D.Offner撰写的《计算?中的数字》(https://cs.umb.edu/~offner/files/pi.pdf) ,第19-26页。最终公式显示在第26页。我编写的初始公式有错别字,请刷新页面以查看固定公式。2第54页中解释了最大术语中的常数项。该白皮书还介绍了一种高级迭代算法,但是我在这里没有使用它。

要计算的级数? (固定错字)

如果一个人使用许多(例如5000)项来评估该系列,则有可能获得千位数的?。容易,并且我发现使用此算法,该系列也易于迭代评估:

算法

  1. 首先,重新排列公式以从数组中获取其常数项。

重新排列公式(修正了另一个错字)

  1. 用2填充数组以开始第一次迭代,因此新公式类似于原始公式。

  2. carry = 0

  3. 从最伟大的任期开始。从数组中获得一项(2),将其乘以PRECISION对进行定点除法2 * i + 1,然后将提示作为新项保存到数组中。然后添加下一项。现在递减i,转到下一学期,重复直到i == 1。最后加上最后一项x_0

  4. 由于使用的PRECISION是16位整数10,因此,将获得2个十进制数字,但只有第一个数字有效。将第二个数字另存为进位。显示第一个数字加进位。

  5. x_0 是整数2,不应为后续迭代添加整数,将其清除。

  6. 转到第4步,计算下一个十进制数字,直到获得所需的所有数字为止。

实施1

将此算法转换为C:

#include <stdio.h>
#include <stdint.h>

#define N 2160
#define PRECISION 10

uint16_t terms[N + 1] = {0};

int main(void)
{
    /* initialize the initial terms */
    for (size_t i = 0; i < N …
Run Code Online (Sandbox Code Playgroud)

c algorithm fixed-point numerical-computing mathematical-expressions

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

您可以使用花括号初始化列表作为(默认)模板参数吗?

我需要定义一个接受多个 3D 坐标作为参数的 C++ 模板。当这些坐标的所有维度都定义为单独的整数变量时,参数列表将变得非常长 - 3 个坐标需要 9 个参数,这使得模板难以使用。

因此,非常希望以使用编译时数组的方式声明模板。它们的默认参数也应该直接在模板声明的位置声明为值,而不是变量名。

经过一些实验,令我惊讶的是,我发现 GCC 13 将接受以下 C++ 程序std=c++20

#include <cstdio>
#include <array>

template <
    std::array<int, 3> offset = {0, 0, 0}
>
struct Array
{
    void operator() (int i, int j, int k) 
    {
        printf("(%d, %d, %d)\n", i + offset[0], j + offset[1], k + offset[2]);
    }
};

int main(void)
{
    Array arr_default;
    arr_default(0, 0, 0);

    Array<{1, 1, 1}> arr;
    arr(0, 0, 0);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然而,clang 18 拒绝使用 …

c++ language-lawyer list-initialization braced-init-list c++-templates

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

MouseArea窃取了QML元素的鼠标事件

如果我放置一个MouseAreaQML元素,那么MouseArea将窃取所有鼠标事件.因此,TextEdit将是不可编辑和不可选择的.

TextEdit {
    // some properties
    MouseArea {
        // some properties
        OnClicked: { /* do something */ }
    }
}
Run Code Online (Sandbox Code Playgroud)

有办法解决吗?

顺便说一句,如果我把一个大的MouseArea放在另一个上MouseArea,更大的MouseArea将窃取所有鼠标事件.我该如何解决?我认为手动传递鼠标事件可以解决这个问题,但是怎么做呢?

qml

11
推荐指数
2
解决办法
2万
查看次数

使用统一共享内存而不是设备内存时,SYCL 性能下降 4000%

在SYCL中,内存分为三种类型:主机内存、设备内存和统一共享内存(USM)。对于主机和设备内存,数据交换需要显式复制。同时,进出 USM 的数据移动由 SYCL 运行时自动隐式管理。

sycl::malloc_device()不幸的是,在使用 SYCL 为数值内核实现 GPU 加速的过程中,我发现仅通过切换到到,性能就会下降高达 4000% sycl::malloc_shared()- 即使我所做的只是重复重新提交相同的 SYCL 内核,而不做任何尝试从主机访问数据。

当使用针对 AMD HIP GFX906 (Radeon VII / Instinct MI50) 的 OpenSYCL 构建代码时sycl::malloc_device(),程序在 0.27 秒内完成:

$ time ./fdtd.elf 
simulate 16974593 cells for 10 timesteps.

real    0m0.271s
user    0m0.253s
sys     0m0.020s
Run Code Online (Sandbox Code Playgroud)

当使用 构建相同的代码时sycl::malloc_shared(),程序需要 10.6 秒才能完成:

simulate 16974593 cells for 10 timesteps.

real    0m10.649s
user    0m15.172s
sys     0m0.196s
Run Code Online (Sandbox Code Playgroud)

这是 3925% 的减速。

在BIOS中启用“4G以上解码”和“可调整BAR大小”支持后,现在需要3.8秒而不是10.6秒。但这并不能解决不必要的内存传输的实际问题 - 1300% 的性能损失仍然相当显着。

我之前也使用英特尔 DPC++ 编译器测试了类似的内核,并在相同的硬件上看到了类似的结果。

我怀疑速度减慢是由不必要的主机和设备复制引起的,但我不确定。SYCL 运行时使用什么启发法来确定是否需要复制?

下面附有示例代码。

ArrayNXYZ.hpp:4维数组(n,x,y,z)包装类。 …

c++ hpc gpgpu sycl dpc++

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

如何在Qt中获得系统默认字体大小?

Qt使用9px默认字体大小,但用户(在Linux上)可以通过使用来改变它qtconfig.

那么,我如何获得系统默认的字体大小?我看了文档,但是找不到任何API.

fonts qt

9
推荐指数
2
解决办法
5401
查看次数

与另一个git存储库保持同步?

我在Github上分叉了一个存储库.现在,原来有一些更新.如何从原始存储库中提取更改并与它们保持同步?

如果我的源与原始源冲突,我是否有机会手动编辑它?

编辑1:谢谢大家的帮助.我想我需要RTFM :)

git github

8
推荐指数
3
解决办法
8692
查看次数

如何在 X11 上的所有 Windows(不仅仅是一个)中监视鼠标移动事件

我正在尝试编写一个 X11 程序来监视桌面上的所有鼠标移动。每当人类用户移动鼠标或通过XWarpPointer()机器人应用程序以编程方式移动鼠标时,该程序应该能够接收通知。我知道通过设置PointerMotionMaskviaXSelectInput()和 monitor应该可以实现MotionNotify,但是我在从所有窗口接收鼠标事件时遇到了麻烦,而不仅仅是一个窗口。

最初,在下面的演示中,我只是尝试从根窗口接收指针运动事件。

#include <stdio.h>
#include <X11/Xlib.h>

int main(int argc, char **argv)
{
    Display *display;
    Window root_window;
    XEvent event;

    display = XOpenDisplay(0);
    root_window = XRootWindow(display, 0); 
    XSelectInput(display, root_window, PointerMotionMask);

    while (1) {
        XNextEvent(display, &event);
        switch(event.type) { 
            case MotionNotify:
                printf("x: %d y: %d\n", event.xmotion.x, event.xmotion.y );
                break;
        }
    }   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它不会接收任何事件,除非鼠标指针位于空桌面背景上。很明显,仅仅从根窗口接收事件是行不通的。然后我尝试了一个解决方法:首先,SubstructureNotifyMask在根窗口上设置以监视所有CreateNotify事件以捕获所有新创建的窗口,然后调用XSelectInput()以启用PointerMotionMask这些窗口。

#include <stdio.h>
#include <X11/Xlib.h>

int main(int argc, char …
Run Code Online (Sandbox Code Playgroud)

c linux x11 user-interface

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

如何从QVBoxLayout中删除(子)布局项?

我发现了很多关于从QVBoxLayout中删除小部件的答案.

但我没有找到任何关于删除布局的答案.我知道我可以把我的子布局放到QWidget中.我只是想了解更多.

layout = QtGui.QVBoxLayout()
item_in_layout = create_layout()
layout.addLayout(item_in_layout)
# Remove?
Run Code Online (Sandbox Code Playgroud)

qt

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