Tag: multithreading

Unix pthreads和信号:每个线程信号处理程序

我无法让线程捕获正确的信号。 例如, 我首先开始一个主线程(tid 1)。 然后,它使用signal(2) SIGUSR1的信号处理程序设置为function1( signal(2) 。 主线程使用tid 2创建一个新线程。 在线程2中,我使用signal(2) SIGUSR1的信号处理程序注册到function2() signal(2) 。 线程1然后创建线程3(tid 3)。 从线程3,我使用pthread_kill(1, SIGUSR1)向线程1发送信号。 但是, function2()被调用,而不是function1() 。 这种行为是否有意,或者是否需要更改以使这些信号处理程序工作? 编辑:我已经完成了一些调试,结果是信号IS被发送到线程1,但是function2()由于某种原因从线程1调用。 这有解决方法吗?

如何定义线程局部本地静态变量?

如何定义不在不同线程之间共享的本地静态变量(在函数调用之间保持其值)? 我正在寻找C和C ++的答案

是否可以在Android中设置与sched_setaffinity的亲和力?

是否可以在使用Android NDK编译的本机C代码中设置CPU亲和力? 由于系统使用的是Linux内核,因此应该可以使用sched_setaffinity / sched_getaffinity函数,但是当我使用NDK进行编译时,我会收到错误抱怨cpu_set_t类型未知(用作函数的参数) 。 有没有其他方法可以实现这一目标? 当我使用CodeSourcerys ARM编译器(arm-none-linux-gnueabi-gcc)编译时,这似乎不是问题,因此系统显然支持所需的系统调用。

什么是_REENTRANT标志?

编译multithreading程序我们使用gcc如下: gcc -lpthread -D_REENTRANT -o someprogram someprogram.c 标志-D_REENTRANT到底在做什么?

当只有一个线程写入共享变量时,是否需要锁定?

我有2个线程和一个共享的float全局。 一个线程只写入变量,而另一个线程只读取它,我是否需要锁定对此变量的访问? 换一种说法: volatile float x; void reader_thread() { while (1) { // Grab mutex here? float local_x = x; // Release mutex? do_stuff_with_value(local_x); } } void writer_thread() { while (1) { float local_x = get_new_value_from_somewhere(); // Grab mutex here? x = local_x; // Release mutex? } } 我主要担心的是float的加载或存储不是primefaces的,因此local_x中的reader_thread最终会出现虚假,部分更新的值。 这是一个有效的问题吗? 是否有另一种方法可以在没有互斥锁的情况下保证primefaces性? 使用sig_atomic_t作为共享变量是否可行,假设它有足够的位用于我的目的? 有问题的语言是使用pthreads的C.

在OpenMP中插入排序

我正在尝试为插入排序编写OpenMP解决方案,但我遇到问题,让它并行运行并给出正确的结果:)。 有没有办法让Insertion排序并行运行。 这是我的代码: void insertionsort(int *A, int num) { // clock_t start, stop; // // start=clock(); int k; #pragma omp parallel for shared(A) private(k) for(int n = 1; n 0 && A[k-1]> key;k–) { A[k] = A[k-1]; } A[k] = key; } // stop=clock(); // cas = (double)(stop-start)/CLOCKS_PER_SEC; }

如何让OpenMP在每次运行程序时只创建一次线程?

我正在尝试并行化由第三方编写的大型程序。 我无法透露代码,但我会尽力给出我想做的最接近的例子。 基于以下代码。 正如您所看到的,由于“并行”子句在INS循环中,因此每次迭代都会完成线程的创建/销毁,这是非常昂贵的。 鉴于我无法将Initializors …等移动到“while”循环之外。 – 基础代码 void funcPiece0() { // many lines and branches of code } void funcPiece1() { // also many lines and branches of code } void funcCore() { funcInitThis(); funcInitThat(); #pragma omp parallel { #pragma omp sections { #pragma omp section { funcPiece0(); }//omp section #pragma omp section { […]

在C ++中执行线程的奇怪顺序

我试图从Linux Tutorial Posix Threads执行第一个例子。 这就是我所拥有的: [alex@Allok c_c++]$ g++ -lpthread from.cpp from.cpp: In function ‘int main()’: from.cpp:10:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] from.cpp:11:22: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] [alex@Allok c_c++]$ ./a.out Thread 2 Thread 1 Thread 1 returns: 0 Thread 2 returns: 0 问题是我希望输出像源一样说: Thread 1 Thread 2 […]

实现用户级线程包

我已经在一个类中负责在C中创建一个用户级线程库。我想知道是否有人可以给我一个事项列表来阅读以实现这一目标。 我对从哪里开始有一个好主意,但是用户级线程上的任何资源以及可能有用的C语言的一些适用方面都非常有价值。 我不清楚如何实现这样的调度程序。 假设我对C语言及其一些更有用的库函数有很好的理解。

Linux / gcc中InterlockedIncrement的等价物

这将是一个非常简单的问题(可能重复),但我无法找到它。 Win32 API提供了一组非常方便的primefaces操作(如内在函数),例如InterlockedIncrement ,它发出lock add x86代码。 此外, InterlockedCompareExchange映射到lock cmpxchg 。 但是,我想在Linux中用gcc做到这一点。 由于我正在使用64位,因此无法使用内联汇编。 是否存在gcc的内在函数?