Tag: multithreading

pthread_create()的返回码是11

我试图运行一个简单的multithreading编程,我从gcc得到这个错误 pthread_create()的返回码是11 我该如何解决这个问题? #include #include #include #define NUM_THREADS 20000 void *PrintHello(void *threadid) { long tid; tid = (long)threadid; printf(“Hello World! It’s me, thread #%ld!\n”, tid); pthread_exit(NULL); } int main (int argc, char *argv[]) { pthread_t threads[NUM_THREADS]; int rc; long t; for(t=0; t<NUM_THREADS; t++){ printf("In main: creating thread %ld\n", t); rc = pthread_create(&threads[t], NULL, PrintHello, (void […]

线程实现

我想知道如何实现我自己的线程库。 我所拥有的是CPU(PowerPC架构)和C标准库。 我可以看一下开源轻量级实现吗?

强制执行C语句的顺序?

我遇到了MS C编译器重新排序某些语句的问题,这些语句在multithreading上下文中非常重要,并且处于高优化级别。 我想知道如何在特定的地方强制订购,同时仍然使用高水平的优化。 (在低优化级别,此编译器不重新排序语句) 以下代码: ChunkT* plog2sizeChunk=… SET_BUSY(plog2sizeChunk->pPoolAndBusyFlag); // set “busy” bit on this chunk of storage x = plog2sizeChunk->pNext; 产生这个: 0040130F 8B 5A 08 mov ebx,dword ptr [edx+8] 00401312 83 22 FE and dword ptr [edx],0FFFFFFFEh 其中pPoolAndBusyFlag的写入由编译器重新排序,在pNext fetch 之后发生。 SET_BUSY本质上是 plog2sizeChunk->pPoolAndBusyFlag&=0xFFFFFFFeh; 我认为编译器已经正确地决定重新排序这些访问是正确的,因为它们是同一结构的两个独立成员,并且这种重新排序对单线程执行的结果没有影响: typedef struct chunk_tag{ unsigned pPoolAndBusyFlag; // Contains pointer to owning pool and […]

使用Matlab进行multithreading处理

我正在研究Matlab上的一个项目,我们必须优化性能,我正在考虑并行化一些从.m文件生成的函数调用。 这个想法很简单,从Matlab文件(.m)调用编译为MEX的C文件,并从该C文件创建几个线程并从每个线程回调matlab函数。 理论工作,我可以创建线程,我也可以调用matlab函数,问题是我不能从线程调用matlab函数: //Global variables mxArray **g_plhs; mxArray **g_prhs; int g_nlhs; int g_nrhs; //Thread function DWORD WINAPI my_function( LPVOID lpParam ) { mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,”matlab_function”); return 0; } //Main function void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { DWORD dwThreadIdArray[MAX_THREADS]; HANDLE hThreadArray[MAX_THREADS]; g_plhs = plhs; g_prhs = prhs; g_nlhs = nlhs; g_nrhs = nrhs; […]

并行化Fibonacci序列生成器

我正在学习并行化,在一个练习中,我给出了一些我应该提高性能的算法。 其中一个是Fibonacci序列生成器: array[0] = 0; array[1] = 1; for (q = 2; q < MAX; q++) { array[q] = array[q−1] + array[q−2]; } 我怀疑这是不能优化的(通过并行化),因为每个数字都取决于前两个数字(因此间接地依赖于所有前面的数字)。 怎么可以并行化呢?

Peterson的算法对各种优化标志的行为

我想检查gcc和icc的行为以获得各种优化选项。 采用彼得森的2线程互斥算法。 如果交换了lock方法中第a行和第b行(在注释中)的执行顺序,则此算法可能会失败。 使用icc或带有-O0标志的gcc进行编译会产生正确的结果。 使用带有-O3标志的icc进行编译会产生不正确的结果。 使用带有-O3标志的gcc进行编译不会产生任何结果。 程序挂起。 所以我的猜测是-O3标志,gcc和icc都优化了锁定方法,并假设线a和线b之间没有依赖关系。 因此两者产生了错误的结果 这样的依赖很难让编译器找到,所以有没有办法(像ivdep这样的编译器)告诉编译器特定代码块中的依赖关系,这样我们仍然可以在代码的其他部分使用-O3标志 锁定方法: void lock(int me) { int other; other = 1-me; flag[me] = 1; //Line a victim = me; //Line b while(flag[other]==1 && victim == me) { } } 如果交换了行a和行b的执行顺序,则为MUTEX违规的示例: T0 0 sets victim=0 T1 1 sets victim=1 T2 1 sets flag[1]=1 T3 1 checks flag[0]. […]

gcc -lpthread不工作

我在我的系统中安装了ubuntu 11。 我有一个使用pthread库的ac程序。 即使我使用标志-lpthread进行编译,我也会收到错误的Undefined reference to sem_wait() 。 例如: gcc -lpthread prog.c 该程序适用于其他ubuntu安装。

静态变量和线程(C)

我知道在C中的函数中声明一个静态变量意味着该变量在函数调用之间保留其状态。 在线程的上下文中,这是否会导致变量在多个线程上保持其状态,或者在每个线程之间具有单独的状态? 这是过去的纸质考试问题,我正在努力回答: 以下C函数旨在用于为其调用者分配唯一标识符(UID): get_uid() { static int i = 0; return i++; } 解释get_uid()在multithreading调用它的环境中可能以何种方式正常工作。 使用特定示例方案,详细说明可能发生此类错误行为的原因和方式。 目前我假设每个线程都有一个单独的变量状态,但我不确定这是否正确,或者答案是否与缺少互斥有关。 如果是这种情况,那么在这个例子中如何实现信号量呢?

OpenMP特定线程数急剧减速

我运行了一个OpenMP程序来执行Jacobi方法,它运行得非常好,2个线程执行略超过2x 1线程,4个线程比1个线程快2倍。 我觉得一切都很完美……直到我准确地达到了20,22和24个线程。 我一直把它分解,直到我有这个简单的程序 #include #include int main(int argc, char *argv[]) { int i, n, maxiter, threads, nsquared, execs = 0; double begin, end; if (argc != 4) { printf(“4 args\n”); return 1; } n = atoi(argv[1]); threads = atoi(argv[2]); maxiter = atoi(argv[3]); omp_set_num_threads(threads); nsquared = n * n; begin = omp_get_wtime(); while (execs < […]

我是否应该在一个线程中锁定一个变量,如果我只需要在其他线程中使用它的值,为什么我不这样做呢?

我知道这个问题 ,但我相信我的担忧是非常不同的。 我最近使用线程和OpenGL创建了一个SDL应用程序。 我有一个线程在循环中运行,它不断更新我绘制到屏幕的对象的状态。 状态非常简单,它只是一个布尔数组(当数组值为true时,我绘制它,当它为假时,我没有)。 目前,我的任何变量都没有互斥锁,一切正常。 即使只有一半的状态数组在绘制之间更新,帧速率也要高得多(或至少等于)更新速率,因此具有半更新状态是可以接受的。 现在,我最初在使用中断的嵌入式系统上开始研究类似的想法。 每隔一段时间,一个中断就会触发,更新状态数组,执行将继续。 现在我正在使用多核桌面,并同时更新arrays,我想知道为什么没有发生任何不好的事情,因为我在技术上同时读取和写入相同的内存位置。 是偶然的,还是有没有原因导致没有发生内存访问冲突? 如果在使用该值之前,期间或之后变量的状态是可以接受的,那么我是否应该使用互斥锁? 谢谢您的帮助。 编辑:附加信息 – 数组是动态创建的,但是当它被创建/删除时,我确实使用了互斥锁(我认为访问已删除的内存不会看起来很友好:P)。