根据这个站点,可以volatile sig_atomic_t在信号处理程序中使用类型的变量.现在我的问题是,例如下面的代码仍然是原子的,因此没有引入竞争条件?
假设我们使用的是多核处理器(编辑:运行多线程程序).并volatile sig_atomic_t针对多核系统摆在首位,甚至工作,或者我们应该使用atomic<unsigned int>的C++ 11的信号处理多核系统上(编辑:在运行多线程程序)?
volatile sig_atomic_t a;
static void signal_handler(int sig, siginfo_t *si, void *unused)
{
int b;
................
b = ...;
a = a | b;
................
}
Run Code Online (Sandbox Code Playgroud) 假设我使用/ dev/zero为mmap分配一个大内存(40MB),如下所示.
fd = open("/dev/zero", O_RDWR);
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0);
Run Code Online (Sandbox Code Playgroud)
我的理解是,当页面被带入物理内存时,内核会将内存初始化为零(我认为现代Linux内核使用Demand分页).因此,例如,当第一页被触摸并因此被带入物理存储器时,内核将其所有4096字节初始化为零,然后当触摸第二页时,它执行相同的操作,依此类推.
我的理解是否正确?
浮点计算既不是关联的,也不是处理器上的分配.所以,
(a + b) + c 不等于 a + (b + c)
和a * (b + c)不等于a * b + a * c
有没有办法执行不会给出不同结果的确定性浮点计算.它对于单处理器来说是确定性的,但是如果线程增加一个总和,它在多线程程序中就不是确定性的,因为线程可能有不同的交错.
所以我的问题是,如何在多线程程序中实现浮点计算的确定性结果?
当我尝试使用LD_PRELOAD时,如下
LD_PRELOAD=getpid.so ./testpid
Run Code Online (Sandbox Code Playgroud)
我收到以下错误...
ERROR: ld.so: object 'getpid.so' from LD_PRELOAD cannot be preloaded: ignored.
Run Code Online (Sandbox Code Playgroud)
我使用编译getpid.so
gcc -Wall -fPIC -shared -o getpid.so getpid.c
Run Code Online (Sandbox Code Playgroud)
它包含以下代码......
// getpid.c
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
pid_t getpid(void)
{
printf("Hello, world!\n");
return syscall(SYS_getpid);
}
Run Code Online (Sandbox Code Playgroud)
tespid.c 使用getpid的constains代码,如下所示,并通过执行编译
gcc testpid -o testpid.c
Run Code Online (Sandbox Code Playgroud)
这可能是什么问题?为什么LD_PRELOAD不起作用?
// testpid.c
#include <sys/syscall.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
printf( "pid = %d!\n", getpid() );
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在写一个工具.该工具的一部分是它能够记录系统调用的参数.好吧,我可以ptrace用于此目的,但ptrace速度很慢.我想到的一种更快的方法是修改glibc.但这变得越来越困难,因为gcc神奇地将自己的内置函数作为系统调用包装器插入,而不是使用glibc中定义的代码.使用-fno-builtin也没有帮助.
所以我提出了编写共享库的想法,其中包括每个系统调用包装器,例如mmap然后在调用实际系统调用包装器函数之前执行日志记录.例如,mmap下面给出了我的样子的伪代码.
int mmap(...)
{
log_parameters(...);
call_original_mmap(...);
...
}
Run Code Online (Sandbox Code Playgroud)
然后我可以使用LD_PRELOAD首先加载这个库.你觉得这个想法会起作用,还是我错过了什么?
我有一个连接到主处理器的协处理器.某些浮点计算需要在协处理器中完成,但它不支持硬件浮点指令,并且仿真速度太慢.
现在,一种方法是让主处理器缩放浮点值,以便它们可以表示为整数,将它们发送给执行某些计算的协处理器,并在返回时缩减这些值.然而,这在大多数情况下都不会起作用,因为数字最终会变得太大或太小而不能超出这些整数的范围.所以我的问题是,正确做到这一点的最快方法是什么.
数据流分析和抽象解释之间有什么区别,它们是否用于相同的目的?这两者相对于彼此的利弊是什么.
compiler-construction static-analysis dataflow abstract-interpretation
这样做的pthread_mutex_lock和调用pthread_mutex_unlock函数调用的存储栅栏/屏障指令?或者像compare_and_swap暗示那样的低级指令是否有内存障碍?
我对该sched_yield函数几乎没有任何疑问,因为我发现它在我的代码中没有按预期运行.很多时候,当我尝试通过调用产生它时,我看到同一个线程一次又一次地运行,即使存在其他线程sched_yield.
此外,如果我有多sched_yield核,将为所有核心上运行的线程或仅一个核心运行.例如,我在核心1上运行线程1,2和3,在核心2上运行线程4,5和6,并且sched_yield从线程2调用If ,它将仅由线程1和3替换,或者1,3,4 ,5和6都可能吗?我问这个是因为.Net Thread.Yield只会产生在同一个核心/处理器上运行的线程.
我正在调查setjmp/longjmp,发现setjmp保存了诸如指令指针,堆栈指针等寄存器......
但是我不知道的是,在调用setjmp和longjmp之间,不能修改线程堆栈中的数据本身.在这种情况下,不会longjmp不能按预期工作.
为了说清楚,例如,当longjmp恢复堆栈指针时,说现在堆栈指针所指向的内存中的数据与调用setjmp时的数据不同.这会发生吗?如果发生这种情况,我们不是有麻烦吗?
另外,语句的意思是" 在调用setjmp()例程的例程返回后,可能不会调用longjmp()例程. "