小编Met*_*est的帖子

Linux中如何保护进程间共享的内存

在 Linux 或其他现代操作系统中,每个进程的内存都受到保护,因此一个进程中的疯狂写入不会导致任何其他进程崩溃。现在假设我们在进程 A 和进程 B 之间共享内存。现在假设,由于软错误,进程 A 无意中向该内存区域写入了一些内容。鉴于进程 A 和进程 B 都对该内存具有完全写访问权限,是否有任何方法可以防止这种情况发生?

c linux memory

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

在Linux中无限期地睡眠一个线程

我想让一个线程无限期地睡眠.我想这样做的原因是因为我的程序只在收到信号时才采取行动,并且在主线程中无关.因此,所有处理都在信号处理程序内完成.我怎么能无限期地睡觉?

c linux

5
推荐指数
2
解决办法
8258
查看次数

在高速缓存一致性方面,旋转循环的开销

假设一个核心中的线程正在旋转一个变量,该变量将由另一个核心上运行的线程更新.我的问题是缓存级别的开销是多少.等待线程是否会缓存变量,因此在写入线程写入该变量之前不会导致总线上的任何流量?

如何减少这种开销.x86 pause指令有帮助吗?

c linux x86 multithreading multicore

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

地址空间中未使用的内存是否受保护

进程的地址空间中未使用的内存是否仅受到读取权限的保护,因此写入单位指针指向的位置总是会导致页面错误被操作系统捕获?或者不是这种情况,并且除了代码之外的每个存储器位置(哪个都是只读访问权限)都被赋予写访问权限?

我问这个是因为我的朋友正在向我展示他的代码,他没有初始化指针并在其指向的内存中写入,但仍然他的程序没有崩溃与mingw gcc编译器的Windows但总是崩溃与visual c ++ ,在mac或linux中.

我认为操作系统不保护未使用区域的内存,并且导致崩溃,因为在mingw生成的代码中,随机指针值指向某些使用区域,如堆栈,堆或代码,而在其他它指向一些自由区域.但是,如果操作系统真的不能保护未使用的区域,那么这些类型的错误,例如未初始化的指针是否难以调试?

我想这就是为什么它被建议打完电话后始终分配给NULL指针delete或者free,这样,当有人与它访问,它真的会导致明显的崩溃.

c linux operating-system

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

为什么我会收到此错误?void*不是指向对象类型的指针.

void *stackAddr[NUM_THREADS];

stackAddr[i] = malloc(STACKSIZE);
Run Code Online (Sandbox Code Playgroud)

编译器(g ++ 4.4.3)抱怨调用malloc的地方......

warning: pointer of type ‘void *’ used in arithmetic
error: ‘void*’ is not a pointer-to-object type
Run Code Online (Sandbox Code Playgroud)

如果你有兴趣看到整个代码,这里就是......

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NUM_THREADS 4

void *stackAddr[NUM_THREADS];
pthread_t thread[NUM_THREADS];
pthread_attr_t attr;

void *BusyWork(void *t)
{
   int i;
   long tid;
   double result=0.0;
   tid = (long)t;

   printf("Thread %ld starting...\n",tid);
   for ( i = 0; i < 1000; i++)
   {
      result = result + sin(i*tid) * tan(i*tid);
   }
   printf("Thread %ld done. Result …
Run Code Online (Sandbox Code Playgroud)

c c++ linux gcc g++

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

设置主线程的堆栈

出于某种原因,我在调用pthread_create之前使用pthread_attr_setstack函数为我的应用程序中的所有线程创建自己的堆栈.但是,我也希望为我的主线程提供一个自定义堆栈.我怎样才能做到这一点?

如果那是不可能的,我怎么能至少得到主线程的堆栈地址和大小?

c linux x86 gcc

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

在gcc内联汇编中调用函数

说,我想在gcc的内联汇编中调用具有以下签名的函数.我怎样才能做到这一点?

int some_function( void * arg );
Run Code Online (Sandbox Code Playgroud)

c linux x86 gcc inline-assembly

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

为什么gcc使用jmp来调用优化版本中的函数

当我组装我的程序时,我看到gcc在使用-O3编译时使用jmp进行第二次pthread_wait_barrier调用.为什么会这样?

使用jmp而不是call会有什么好处.编译器在这里玩什么技巧?我猜它在这里执行尾调用优化.

顺便说一下,我在这里使用静态链接.

__attribute__ ((noinline)) void my_pthread_barrier_wait( 
    volatile int tid, pthread_barrier_t *pbar ) 
{
    pthread_barrier_wait( pbar );
    if ( tid == 0 )
    {
        if ( !rollbacked )
        {
            take_checkpoint_or_rollback( ++iter == 4 );
        }
    }
    //getcontext( &context[tid] );
    SETJMP( tid );
    asm("addr2jmp:"); 
    pthread_barrier_wait( pbar );
    // My suspicion was right, gcc was performing tail call optimization, 
    // which was messing up with my SETJMP/LONGJMP implementation, so here I
    // put a …
Run Code Online (Sandbox Code Playgroud)

c linux x86 gcc

5
推荐指数
2
解决办法
1101
查看次数

从gcc的中间文件编译目标文件

通过使用-fdump-tree-*标志,可以在编译源代码文件期间转储一些中间格式文件.我的问题是,如果可以使用该中间文件作为gcc的输入来获取最终的目标文件.

我问这个是因为我想在gimple的中间文件中添加一些代码(通过使用flag -fdump-tree-gimple获得)格式.当然我可以使用钩子并添加我自己的传球,但我不想达到那种复杂程度.我只想给gcc我修改过的中间文件,所以它可以从那里开始编译并给我最终的目标文件.任何想法如何实现这一目标?

c linux compiler-construction gcc backend

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

编译clang-llvm示例

我正在尝试编译目录中的Hello示例lib/Transforms/Hello,它基本上是LLVM传递的Hello World,但是当我尝试使用make编译它时,我收到以下错误.

../../../Makefile.common:61: ../../../Makefile.config: No such file or directory
../../../Makefile.common:69: /Makefile.rules: No such file or directory
make: *** No rule to make target `/Makefile.rules'.  Stop.
Run Code Online (Sandbox Code Playgroud)

知道问题是什么以及如何解决?

c c++ llvm clang

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