Tag: multithreading

此解决方案中的信号量使用是否正确?

问题:我必须增加x1和x2变量,这应该由不同的线程完成,并且在两个变量的上一个增量都没有完成之前,不应该调用两个变量的下一个增量。 建议的解决方案:初始化4个信号量并调用单独的线程以单独增加变量。 2个信号量,用于将消息传递给线程以开始递增; 2个信号量,用于将消息传递到主线程,以完成递增。 主线程将等待来自两个子线程的信号量发布,显示两个变量的增量完成,然后主线程将消息传递给两个子线程,允许进一步递增。 这个目前对我来说很好。 但是,一个人能提出更好的解决方案吗? 或者,任何人都可以在此解决方案中指出问题吗? 任何帮助将不胜感激? 提前致谢。 解决方案代码 #include #include #include //Threads pthread_t pth1,pth2; //Values to calculate int x1 = 0, x2 = 0; sem_t c1,c2,c3,c4; void *threadfunc1(void *parm) { for (;;) { x1++; sem_post(&c1); sem_wait(&c3); } return NULL ; } void *threadfunc2(void *parm) { for (;;) { x2++; sem_post(&c2); sem_wait(&c4); } […]

访问共享内存以进行读取时锁定

如果我访问共享内存只读,要检查if()块的条件,我还应该锁定互斥锁吗? 例如 mutex_lock(); if (var /* shared memory */) { } mutex_unlock(); 锁定在这里需要和良好的做法?

pthread_cancel()函数无法终止线程

我正在使用pthread_create()和pthread_cancel()函数来创建一个multithreading程序,但我注意到pthread_cancel()并没有真正终止它应该的线程。 void check(void *param){ header_t *Bag = (header_t *) param; pthread_t timer_thread; while(true){ if(Bag->size && TIMER_OFF){ pthread_create(&timer_thread, NULL, (void *) &timer, (void *) Bag); printf(“\nCREATE THREAD ID = %d\n”, timer_thread); // ADD } else if(!TIMER_OFF && Bag->size >= 2 && Bag->next->time next->tag){ printf(“\nOLD THREAD ID = %d TO BE CANCELLED\n”, timer_thread); pthread_cancel(timer_thread); pthread_create(&timer_thread, NULL, (void […]

什么限制了这个简单的OpenMP程序的扩展?

我试图了解48核系统上的并行化限制(4xAMD Opteron 6348,2.8 Ghz,每个CPU 12个核心)。 我写了这个微小的OpenMP代码来测试加速,我认为这是最好的情况(任务是令人尴尬的并行): // Compile with: gcc scaling.c -std=c99 -fopenmp -O3 #include #include int main(){ const uint64_t umin=1; const uint64_t umax=10000000000LL; double sum=0.; #pragma omp parallel for reduction(+:sum) for(uint64_t u=umin; u<umax; u++) sum+=1./u/u; printf("%e\n", sum); } 我惊讶地发现缩放是高度非线性的。 使用48个线程运行代码需要大约2.9s,使用36个线程运行3.1s,使用24个线程运行3.7s,使用12个线程运行4.9s,使用1个线程运行代码需要57s。 不幸的是,我不得不说计算机上运行一个进程使用100%的一个核心,因此可能会影响它。 这不是我的过程,所以我无法结束它来测试差异,但不知何故,我怀疑这是在19到20倍的加速和理想的48倍加速之间的区别。 为了确保它不是OpenMP问题,我同时运行了两个程序副本,每个程序有24个线程(一个用umin = 1,umax = 5000000000,另一个用umin = 5000000000,umax = 10000000000)。 在这种情况下,程序的两个副本在2.9s之后完成,因此它与使用单个程序实例运行48个线程完全相同。 用这个简单的程序阻止线性缩放的是什么?

使用pthread在C中生成随机数的最正确方法是什么

我有几个并发运行的线程,每个线程都必须生成随机数。 我想了解是否存在要遵循的模式,以了解在主线程中使用srand初始化随机生成器是否正确,或者每个线程是否必须初始化其自己的随机生成器。 似乎rand / srand没有被设计为与线程一起使用,我想知道如何处理线程和随机数。 谢谢 编辑:我需要纯随机数,但我也有兴趣为测试目的生成确定性序列。 我在Linux上,但我更喜欢尽可能地编写代码。

如何确定Win32线程是否已终止?

如何确定Win32线程是否已终止? GetExitCodeThread的文档警告不要因为这个原因使用它,因为出于其他原因可以返回错误代码STILL_ACTIVE。 谢谢您的帮助! 🙂

为什么使用select()而不是sleep()?

我正在编写一个关于iPhone音频的章节,并且遇到了一段我无法理解的代码: while (aqc.playPtr < aqc.sampleLen) { select(NULL, NULL, NULL, NULL, 1.0); } ( 完整代码示例在第163-166页 )。 根据我对代码的理解,音频正在另一个线程上处理,而while循环就是为了防止主线程在音频仍在处理时终止。 我不明白为什么使用select()而不是sleep() 。 从我读过的内容中, select()用于监视I / O的变化并传递它.NULLs没有做任何有意义的事情。 我使用sleep()运行代码,它按预期工作。 (我对低级别POSIX的了解几乎不存在。)

glibc的fprintf()线程安全实现吗?

fprintf是线程安全的吗? glibc手册似乎说它是,但我的应用程序,使用单个调用fprintf()写入文件似乎是混合来自不同进程的部分写入。 编辑:为了澄清,有问题的程序是一个lighttpd插件,服务器正在运行多个工作线程。 查看该文件,一些写入混合在一起。 编辑2:我看到的问题似乎可能是由于lighttpd的“工作线程”实际上是单独的进程: http : //redmine.lighttpd.net/wiki/lighttpd/Docs : MultiProcessor 问题 通过在同一个套接字上运行2个或更多进程,您将获得更好的并发性,但是您必须注意一些缺点: mod_accesslog可能会创建损坏的访问日志,因为同一个文件打开两次并且未同步。 mod_status将有n个独立的计数器,每个进程一个。 mod_rrdtool将失败,因为它收到两次相同的时间戳。 mod_uploadprogress将不会显示正确的状态。

在内核中处理线程的正确方法?

我已经看到了各种各样的零散信息,但我似乎无法得到最终答案。 你如何清理内核中的僵尸线程? 为了确保并在内核中生成处理线程的最终正确方法,我想更广泛地问这个问题。 如何在Linux内核中创建,终止和清理线程? 到目前为止我所拥有的是: thread_func: exited = 0; while (!must_exit) do stuff exited = 1; do_exit(0) init_module: must_exit = 0; exited = 1; kthread_run(thread_func, …) /* creates and runs the thread */ cleanup_module: must_exit = 1; while (!exited) set_current_state(TASK_INTERRUPTIBLE); msleep(1); /* How do I cleanup? */ 我发现清理解决方案最接近的是release_task ,但我没有找到任何谈论它的地方。 我想,因为线程函数是kthread_create , kthread_run等,应该有一个kthread_join或kthread_wait ,但是没有。 do_wait似乎也有可能,但它不需要struct task_struct […]

C:multithreading

C中是否支持multithreading? 如果是,那我该怎么办? 是否有任何开源库可以让我这样做,并且是Mac OS X支持的库吗? 我没有找到任何文章说它得到了支持。