Tag: multithreading

如何从另一个函数内的随机位置调用C函数?

谁能告诉我如何在C函数内的随机位置插入函数调用(比如Yield() ),这样每次运行代码时,从代码的不同部分调用Yield() ? 我面临着这样的要求:我在协作线程环境中使用2个线程,除非正在运行的线程明确地产生处理器,否则另一个(等待)线程无法开始运行。 我不想将Yield()调用放在单个点上,因为这会使线程序列具有确定性。 如果不重新布线整个环境(从合作到先发制人),这是我能想到的唯一解决方案,Thread_1()在其中的随机位置调用Yield() ,允许Thread_2()接管。 对于达到相同目标的不同解决方案的任何见解也是受欢迎的!

c openmp平行于平行区域内

我的问题就像这个。 但我想做点不同的事…… 例如,在我的并行区域内,我想在4个线程上运行我的代码。 当每个线程进入for循环时,我想在8个线程上运行我的代码。 就像是 #pramga omp parallel num_threads(4) { //do something on 4 threads #pragma omp parallel for num_threads(2) for(int i=0;i<2;i++){ //do something on 8 threads in total } } 那么,有没有办法将每个(4)运行线程“拆分”为两个(新)线程,所以在for循环中有更多(8)个线程正在运行?

将参数传递给pthread_create函数

我使用pthread_create创建10个子线程,将一个整数传递给thread_func #define THREAD_NUM 10 void *thread_func(void *arg) { int v = (int)arg; printf(“v = %d\n”, v); return (void*)0; } int main(int argc, const char *argv[]) { pthread_t pids[THREAD_NUM]; int rv; int i; for (i = 0; i < THREAD_NUM; i++) { rv = pthread_create(&pids[i], NULL, thread_func, (void*)i); if (rv != 0) { perror("failed to create […]

修改静态变量是否安全?

从C ++ 11开始,静态变量初始化保证是线程安全的。 但是如何修改多个线程中的静态变量呢? 如下 static int initialized = 0; Initialize() { if (initialized) return; initialized = 1; // Is this thread safe? } 我问这个问题的原因是我正在阅读Py_Initialize()的源代码,我试图将Python嵌入到multithreadingC ++应用程序中,我想知道在多个线程中多次调用Py_Initialize()是否安全? Py_Initialize()的实现归结为函数_Py_InitializeEx_Private ,如下所示 // pylifecycle.c static int initialized = 0; _Py_InitializeEx_Private(int install_sigs, int install_importlib) { if (initialized) return; initialized = 1; // a bunch of other stuff } C的结论与C ++相同吗? […]

在multithreading应用程序中使用JNI的正确方法

描述 在我的C ++应用程序类JNIXMLDocument中进行了一些JAVA方法调用。 在JNIXMLDocument类的构造函数中,我附加当前线程并将其设置为我的类成员JNIEnv* m_JavaEnv ,然后在所有方法中使用它。 同样在构造函数中,我试图找到我的JAVA类com/fido/android/framework/service/XMLDOMDocument并将其设置为类成员m_XMLDocumentClass并从类中获取该类对象并将其设置为类成员m_XMLDocumentObject 。 C ++代码 class JNIXMLDocument { /* Constructor **/ JNIXMLDocument() { /* Get JNI right version and set it. **/ jint interface_id = JNI_VERSION_1_2; #ifdef JNI_VERSION_1_2 interface_id = JNI_VERSION_1_2; #else interface_id = JNI_VERSION_1_1; #endif /* Trying to attach current thread. **/ int res = g_JavaVirtualMachine->GetEnv(&m_JavaEnv, interface_id); if (res […]

Pthreads无法解释的分段错误

我从Cormen着名的文本中实现了并行合并排序算法。 我使用pthreads在C中编写它,并在Win7 x64上使用MinGW编译(稍后在Ubuntu中使用GCC进行测试,结果相同)。 我在并行化方面的第一种方法是天真的……我在每个递归级别产生了一个新线程(这实际上是Cormen的伪代码所暗示的)。 然而,由于分段错误,这通常会导致太长时间或崩溃(我可以假设系统可以处理多少线程存在一些硬性限制)。 这似乎是递归并行化的常见新手错误,事实上我在这个网站上发现了类似的讨论 。 所以我改为使用该线程中的建议,即设置问题大小的阈值,并且如果生成新线程的函数被赋予小于阈值的集合(比如10,000个元素),那么它只是直接对元素进行操作,而不是为这么小的一组创建一个新线程。 现在一切似乎都运转良好。 我列出了下面的一些结果。 N是问题大小(一组整数[1,2,3,…,N]彻底加扰),阈值是我的并行排序和并行合并函数拒绝生成新线程的值。 第一个表显示以ms为单位的排序时间,第二个表显示每种情况下生成的排序/合并工作线程数。 查看下表中的N = 1E6和N = 1E7行,您可以看到,只要我降低阈值,允许超过~8000个合并工作者,我就会出现分段错误。 同样,我认为这是由于系统给予线程的一些限制,我很乐意听到更多关于这一点,但这不是我的主要问题。 主要问题是,为什么最后一行在尝试使用相当高的阈值时会出现段错误,这会产生预期的15/33工作线程(跟随前一行的模式)。 当然,这对我的系统来说并不是太multithreading。 完成的一个实例(表中右下方的单元格)使用了大约1.2GB的RAM(我的系统有6GB),并且与每行右侧的0个线程相比,线程版本似乎永远不会占用更多RAM。 我认为我没有达到任何类型的堆限制……大量的RAM可用,即使它被允许产生15/33线程也只需要~1GB。 我也不认为这是一个堆栈问题。 我设计的程序使用最小的堆栈,我不认为每个线程的占用空间都与问题大小N有关,只有堆。 我对此非常缺乏经验……但是我在gdb中做了一个核心转储堆栈回溯,堆栈顶部到底部的地址似乎足够接近以排除溢出。 我尝试在Windows中读取pthread_create的返回值…在崩溃前我得到了11次值(但它似乎没有触发崩溃,因为有几个11,然后几个0,即没有错误,然后另一个11)。 该错误代码是EAGAIN,资源不可用……但我不确定它在这里的含义。 而且,在Ubuntu中,每次出现崩溃时错误代码都是0。 我尝试了Valgrind并获得了很多关于内存泄漏的消息,但我不确定这些是否合法,因为我知道Valgrind需要额外的资源,而且我能够在没有Valgrind的情况下在其他问题集大小上获得这些类型的错误。 很明显它与问题规模和系统资源有关……我希望我缺少一些常识,这使得答案非常清楚。 有任何想法吗? 对不起文本的长墙…谢谢你,如果你已经阅读了这么远! 如果相关,我可以发布来源。 编辑:来源添加供参考: #include #include #include #include const int N = 100000000; const int SORT_THRESHOLD = 10000000; const int MERGE_THRESHOLD = 10000000; int sort_thread_count […]

旋转锁实现(OSSpinLock)

我刚开始研究multithreading编程和线程安全性。 我熟悉忙碌的等待,经过一些研究,我现在熟悉自旋锁背后的理论,所以我想我会看一下OSSpinLock在Mac上的实现。 它归结为以下函数(在objc-os.h中定义): static inline void ARRSpinLockLock(ARRSpinLock *l) { again: /* … Busy-waiting … */ thread_switch(THREAD_NULL, SWITCH_OPTION_DEPRESS, 1); goto again; } ( 在这里全面实施 ) 在做了一些挖掘之后,我现在已经大致了解了thread_switch的参数是什么( 这个站点是我发现它的地方)。 我对所读内容的解释是,对thread_switch的这一特定调用将切换到下一个可用线程,并将当前线程的优先级降低到1个周期的绝对最小值。 ‘最终’(在CPU时间内)此线程将再次变为活动状态并立即再次执行goto again; 重新开始忙碌等待的指令。 我的问题是,为什么这个电话实际上是必要的? 我在这里找到了另一个自旋锁的实现(对于Windows这次),它根本不包括(Windows等效的)线程切换调用。

全局变量不保留其在线程中的值

我创建了一个multithreading服务器,它有一个指向链表的全局指针,在线程中我试图插入一些数据,但是那些数据(我插入的)没有保留,可能是在全局值没有保留的线程中。 我使用以下代码(这是最简单的版本。) struct node { int cn; // struct node *next; }; /*GLOBAL VARIABLES*/ struct node *start; //Global pointer to Linked List /* END */ int main(int argc, char *argv[]) { start = (struct node *)malloc(sizeof(struct node)); start -> cn =0; int pid; /* Declaration of Server goes here */ printf(“Server Running …\n”); while (1) […]

使用OpenMP在两个核上设置线程关联

我正在使用一个C程序,使用OpenMP 4.0在Windows7上使用gcc 4.9.2编译。 我的电脑是双核,有四个线程。 我想使用线程亲和力传播并使用2个线程放在不同的核心上。 所以当我从DOS设置环境变量时: 设置OMP_NUM_THREADS = 2 设置OMP_PROC_BIND =传播 设置OMP_PLACES =“核心” 我得到了变量OMP_DISPLAY_ENV = true,这个: libgomp: Invalid value for environment variable OMP_PLACES OPENMP DISPLAY ENVIRONMENT BEGIN _OPENMP = ‘201307’ OMP_DYNAMIC = ‘FALSE’ OMP_NESTED = ‘FALSE’ OMP_NUM_THREADS = ‘2’ OMP_SCHEDULE = ‘DYNAMIC’ OMP_PROC_BIND = ‘SPREAD’ OMP_PLACES = ” OMP_STACKSIZE = ‘12872703’ OMP_WAIT_POLICY = ‘PASSIVE’ OMP_THREAD_LIMIT […]

在子进程内创建线程

#include #include int value=0; void *runner(void *param); int main(int argc,char *argv[]) { int pid; pthread_t tid; pthread_attr_t attr; pid=fork(); if(pid==0){ pthread_attr_init(&attr); pthread_create(&tid,&attr,runner,NULL); pthread_join(tid,NULL); printf(“CHILD VALUE=%d”,value); } else if(pid>0){ wait(NULL); printf(“PARENT VALUE=%d”,value); } } void *runner(void *param){ value=5; pthread_exit(0); } 孩子和父母的价值是什么? 孩子和它创建的线程会共享数据吗? 所以输出将是5和0?