我在我的代码中读取线程局部变量,如下所示,
// tid_local is declared as __thread int tid_local;
long tid = tid_local
Run Code Online (Sandbox Code Playgroud)
看看反汇编的代码,我看到了类似的东西,我怀疑这是通过读取tid_local来指定tid的指令.
movslq %fs:0xfffffffffffffffc,%rbx
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,这是否真的可以成为执行此操作的指令,即从本地线程变量读取,以及gcc是否始终使用fs段存储线程局部变量.这应该怎么样?
我的问题是使用C++ 0x actomic <>类访问C++中的原子变量的速度有多快?什么在缓存级别下降.假设一个线程只是在读它,它是否需要转到RAM或它只能从它正在执行的核心的缓存中读取?假设架构是x86.
我特别感兴趣的是知道一个线程是否只是从它读取,而当时没有其他线程正在写入,惩罚将与读取正常变量相同.如何访问原子变量.每个读取隐含都涉及写入,比如在比较和交换中吗?原子变量是使用比较和交换实现的吗?
我的问题是将OpenMP与pthreads混合是否是一个好主意.是否有那些将这两者结合起来的应用程序.混合这两个是一个好习惯吗?或典型的应用程序通常只使用两者之一.
__declspec( naked )在gcc/g ++中相当于什么?__declspec( naked )实际上用于声明一个没有任何结语和序幕的函数.
我想在没有编写内联汇编的情况下读取堆栈指针寄存器值.我想这样做的原因是因为我想将堆栈指针寄存器值分配给数组元素,我发现使用内联汇编访问数组很麻烦.所以我想做那样的事情.
register "rsp" long rsp_alias; <--- How do I achieve something like that in gcc?
long current_rsp_value[NUM_OF_THREADS];
current_rsp_value[tid] = rsp_alias;
Run Code Online (Sandbox Code Playgroud)
gcc有什么可能吗?
我处于一种情况,我需要在信号处理程序(SIGSEGV信号处理程序,根据我的知识,每个线程基础)内读取二进制搜索树(BST ).BST可以由应用程序中的其他线程修改.
现在由于信号处理程序不能使用信号量,互斥量等因而无法访问共享数据,我该如何解决这个问题呢?请注意,我的应用程序是多线程的,并在多核系统上运行.
该MMAP文件说,下面讲的标志MAP_NORESERVE.
不要为此映射保留交换空间.保留交换空间时,可以保证可以修改映射.如果没有保留交换空间,如果没有可用的物理内存,则可能在写入时获得SIGSEGV.
实际上我想要的只是保留虚拟内存地址而不是分配实际的物理内存.可以使用带有MAP_NORESERVE的mmap完成吗?如果我想使用任何物理内存,我会使用MAP_FORED再次在地址范围内使用MAP_NORESERVE通过mmap分配的地址范围内.
总而言之,我希望内核不为使用带有MAP_NORSERVE标志的mmap分配的内存保留任何物理页面.它是否真的像这样工作,或者如果内核有足够的物理内存,内核是否会分配物理页面?
我发现pthread_barrier_wait非常慢,所以在我的代码中的一个地方我用我的版本的barrier(my_barrier)替换了pthread_barrier_wait,它使用了一个原子变量.我发现它比pthread_barrier_wait快得多.使用这种方法有什么缺陷吗?这是对的吗?另外,我不知道为什么它比pthread_barrier_wait更快?任何线索?
我主要感兴趣的是线程数相等的核心.
atomic<int> thread_count = 0;
void my_barrier()
{
thread_count++;
while( thread_count % NUM_OF_THREADS )
sched_yield();
}
Run Code Online (Sandbox Code Playgroud)根据这篇文章, gcc在生成代码之前使用了几种中间格式.我读到GIMPLE格式使用三个地址代码,这似乎是最容易使用的中间语言.但我需要一些更详细,因为我需要建立一个工具,可以把中间代码,并生成最终的代码之前插入一些代码到它.
为此,我首先需要知道如何生成GIMPLE格式代码并将其保存在文件中.所以我正在寻找一些文件和例子.此外,如果有人使用过这些东西,我是否可以知道这项任务的复杂性,即将一些代码插入到中间代码中?
我的理解是,一个主进程向所有其他进程发送消息.返回的所有其他进程都会向主进程发送消息.这是否足以让障碍工作?如果没有,那还需要什么呢?