Tag: pthreads

作为OpenMP pragma的结果的中间代码

有没有办法获得OpenMP pragma生成的中间源代码? 我想看看每种pragma是如何翻译的。 干杯。

Pthread条件信号 – 未按预期工作

我正在研究一个项目,并尝试使用pthread_cond_wait()和pthread_cond_signal()来同步两个线程。 我的代码看起来像这样: pthread_mutex_t lock_it = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t write_it = PTHREAD_COND_INITIALIZER; int main(int argc, char**argv) { pthread_t t_send_segments, t_recv_acks; pthread_create(&t_send_segments, NULL, send_segments, (void*)NULL); pthread_create(&t_recv_acks, NULL, recv_acks, (void*)NULL); pthread_join(t_recv_acks, (void**)NULL); pthread_mutex_destroy(&lock_it); pthread_cond_destroy(&write_it); } void* send_segments(void *v) { for(;;) { pthread_mutex_lock(&lock_it); printf(“s1\n”); printf(“s2\n”); pthread_cond_wait(&write_it, &lock_it); printf(“s3\n”); printf(“s4\n”); printf(“s5\n”); pthread_mutex_unlock(&lock_it); } return 0; } void* recv_acks(void *v) { for(;;) […]

以特定间隔执行function

任务是每隔x(比如x = 10)秒执行一个函数(比如Processfunction() )。 使用下面的代码,我可以每隔x秒调用一次Processfunction() 。 问题:如何处理函数完成执行需要10秒以上的情况? 一种方法是使用一个标志来指示Processfunction()执行的结束并在调用Processfunction()之前检查它。 有一个更好的方法吗 ? #include #include // for sleep() and usleep() void *timerthread(void *timer_parms) { struct itimerspec new_value; int max_exp, fd; struct timespec now; uint64_t exp; ssize_t s; struct timer_params *p =(struct timer_params*)timer_parms; printf(“starttimer Start\n”); /* Create a CLOCK_REALTIME absolute timer with initial expiration and interval as specified in […]

如何正确挂起线程?

在现有multithreading应用程序的上下文中,我想修改它以便能够挂起线程。 该应用程序由3个工作线程组成,使用pthread_barrier在“锁定步骤”中工作如下: Thread 1 Thread 2 Thread 3 while(1) while(1) while(1) | | | | | | | | | | | | barrier barrier barrier 这段代码一切都很好。 我现在添加一个用于控制其他3个线程的第4个线程,我需要暂停/恢复3个工作线程。 现在我尝试使用全局stop标志和由控制线程写入的条件变量,并在屏障后由工作线程读取。 Thread 1 Thread 2 Thread 3 Thread 4 while(1) while(1) while(1) wait for user input to suspend | | | mutex_lock | | | stop = […]

找不到-lpthread?

我是C编程的新手。 我试图使用pthread API编写一些并发程序。 我为C / C ++开发人员MinGW下载了eclipse IDE。 我已将所有库,头文件放入MinGW文件的相应位置。 当我尝试构建项目时,始终存在错误“无法找到-lpthread”,发生了什么? 我已将“-pthread”添加到GCC编译器中。 我在谷歌搜索了很多,但似乎没有人和我有类似的问题。

为什么POSIX线程比OpenMP慢

我在带有Xeon处理器的Mac Pro上运行完全并行的矩阵乘法程序。 我创建了8个线程(与核心一样多的线程),并且没有共享写入问题(没有写入相同的位置)。 出于某种原因,我使用pthread_create和pthread_join速度大约是使用#pragma openmp两倍。 在任何事情上没有其他差异……相同的编译选项,两种情况下相同的线程数,相同的代码(显然除了pragma / pthread部分)等。 循环非常大 – 我没有并行化小循环。 (我不能真正发布代码,因为它是学校的工作。) 为什么会发生这种情况? OpenMP不使用POSIX线程吗? 怎么会更快?

如何使用pthread_mutex_trylock?

使用trylock: FILE *fp; pthread_mutex_t demoMutex; void * printHello (void* threadId) { pthread_mutex_trylock (&demoMutex); pthread_t writeToFile = pthread_self (); unsigned short iterate; for (iterate = 0; iterate < 10000; iterate++) { fprintf (fp, " %d ", iterate, 4); fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t)); fprintf (fp, "\n", writeToFile, 1); } pthread_mutex_unlock (&demoMutex); pthread_exit (NULL); […]

同步对双向链表的访问

我正在尝试在pthreads环境中在C中实现一个(特殊类型的)双向链表,但是只使用C-wrapped同步指令,如primefacesCAS等,而不是pthread原语。 (列表的元素是固定大小的内存块,几乎肯定不能适合pthread_mutex_t等。)我实际上并不需要完全任意的双向链表方法,只有: 插入列表末尾 从列表的开头删除 基于指向要删除的成员的指针删除列表中的任意点,该指针是从遍历列表之外的源获得的。 因此,描述此数据结构的更好方法可能是队列/ fifo,可以删除队列中的项目。 是否有标准方法来同步这个? 我陷入了可能的死锁问题,其中一些问题可能是所涉及的算法所固有的,而其他问题可能源于这样一个事实,即我正试图在一个有限的空间内工作,并对我能做的事情有其他限制。 编辑 :特别是,如果要同时删除相邻的对象,我会坚持做什么。 大概在删除对象时,您需要获取列表中上一个和下一个对象的锁定,并更新它们的下一个/上一个指针以指向彼此。 但是如果任何一个邻居已经被锁定,这将导致死锁。 我试图找出一种方法,任何/所有发生的删除可以走在列表的锁定部分,并确定当前正在删除过程中的最大子列表,然后锁定该子列表旁边的节点,以便整个子列表整体被删除,但我的头开始受伤.. 😛 结论(?) :为了跟进,我确实有一些我想要工作的代码,但我也对理论问题感兴趣。 每个人的答案都非常有用,并结合我在此处表达的限制之外的细节(你真的不想知道指向要移除的元素的来源和所涉及的同步!)我现在决定放弃本地锁定代码并专注于: 使用大量较小的列表,每个列表都有单独的锁。 在获取锁定之前,最小化锁定所持有的指令数量并以内存(以安全的方式)戳戳,以减少在保持锁定时页面错误和缓存未命中的可能性。 测量人为负荷下的争用并评估这种方法是否令人满意。 再次感谢所有给出答案的人。 如果我的实验不顺利,我可能会回到所概述的方法(特别是弗拉德),然后再试一次。

pthread_create()如何工作?

鉴于以下内容: pthread_t thread; pthread_create(&thread, NULL, function, NULL); pthread_create究竟对thread做了什么? thread加入主线程后终止会发生什么? 如果在thread加入后执行此操作,会发生什么: pthread_create(&thread, NULL, another_function, NULL);

Pthread创建为独立

创建一个脱离的线程时遇到问题。 这是我写的代码: void* testFunction() { pthread_attr_t attr; int chk,rc; pthread_attr_init(&attr); printf(“thread_attr_init: %d\n”,rc); pthread_attr_getdetachstate(&attr, &chk); printf(“thread_attr_getdetachedstate: %d\n”,rc); if(chk == PTHREAD_CREATE_DETACHED ) printf(“Detached\n”); else if (chk == PTHREAD_CREATE_JOINABLE) printf(“Joinable\n”); return NULL; } int main (int argc, const char * argv[]) { pthread_t thread1; pthread_attr_t attr; int rc; rc = pthread_attr_init(&attr); printf(“attr_init: %d\n”,rc); rc = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); printf(“attr_setdetachedstate: […]