小编Met*_*est的帖子

线程局部变量和fs段

我在我的代码中读取线程局部变量,如下所示,

// 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 linux multithreading gcc x86-64

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

在C++中访问原子变量的速度有多快

我的问题是使用C++ 0x actomic <>类访问C++中的原子变量的速度有多快?什么在缓存级别下降.假设一个线程只是在读它,它是否需要转到RAM或它只能从它正在执行的核心的缓存中读取?假设架构是x86.

我特别感兴趣的是知道一个线程是否只是从它读取,而当时没有其他线程正在写入,惩罚将与读取正常变量相同.如何访问原子变量.每个读取隐含都涉及写入,比如在比较和交换中吗?原子变量是使用比较和交换实现的吗?

c++ atomic c++11

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

将OpenMP与pthreads混合使用

我的问题是将OpenMP与pthreads混合是否是一个好主意.是否有那些将这两者结合起来的应用程序.混合这两个是一个好习惯吗?或典型的应用程序通常只使用两者之一.

c linux pthreads openmp

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

gcc/g ++中__declspec(裸)的等价物

__declspec( naked )gcc/g ++中相当于什么?__declspec( naked )实际上用于声明一个没有任何结语和序幕的函数.

c c++ linux gcc g++

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

在不使用gcc的内联汇编的情况下访问寄存器

我想在没有编写内联汇编的情况下读取堆栈指针寄存器值.我想这样做的原因是因为我想将堆栈指针寄存器值分配给数组元素,我发现使用内联汇编访问数组很麻烦.所以我想做那样的事情.

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有什么可能吗?

c x86 gcc inline-assembly

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

读取信号处理程序内的共享数据

我处于一种情况,我需要在信号处理程序(SIGSEGV信号处理程序,根据我的知识,每个线程基础)内读取二进制搜索树(BST ).BST可以由应用程序中的其他线程修改.

现在由于信号处理程序不能使用信号量,互斥量等因而无法访问共享数据,我该如何解决这个问题呢?请注意,我的应用程序是多线程的,并在多核系统上运行.

c linux mutex signals signal-handling

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

带有MAP_NORESERVE的mmap是否会保留物理内存?

MMAP文件说,下面讲的标志MAP_NORESERVE.

不要为此映射保留交换空间.保留交换空间时,可以保证可以修改映射.如果没有保留交换空间,如果没有可用的物理内存,则可能在写入时获得SIGSEGV.

实际上我想要的只是保留虚拟内存地址而不是分配实际的物理内存.可以使用带有MAP_NORESERVE的mmap完成吗?如果我想使用任何物理内存,我会使用MAP_FORED再次在地址范围内使用MAP_NORESERVE通过mmap分配的地址范围内.

总而言之,我希望内核不为使用带有MAP_NORSERVE标志的mmap分配的内存保留任何物理页面.它是否真的像这样工作,或者如果内核有足够的物理内存,内核是否会分配物理页面?

c linux gcc mmap x86-64

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

这种障碍的方法是对的吗?

我发现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)

c c++ multithreading c++11

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

玩gcc的中间格式

根据这篇文章, gcc在生成代码之前使用了几种中间格式.我读到GIMPLE格式使用三个地址代码,这似乎是最容易使用的中间语言.但我需要一些更详细,因为我需要建立一个工具,可以把中间代码,并生成最终的代码之前插入一些代码到它.

为此,我首先需要知道如何生成GIMPLE格式代码并将其保存在文件中.所以我正在寻找一些文件和例子.此外,如果有人使用过这些东西,我是否可以知道这项任务的复杂性,即将一些代码插入到中间代码中?

c compiler-construction gcc backend gimple

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

如何在消息传递系统中实现屏障?

我的理解是,一个主进程向所有其他进程发送消息.返回的所有其他进程都会向主进程发送消息.这是否足以让障碍工作?如果没有,那还需要什么呢?

c c++ message-passing mpi barrier

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