Tag: pthreads

使用唯一结构作为参数C的pthread

我有这段代码给我带来了麻烦。 我知道所有的线程都在读取相同的结构。 但我不知道如何解决这个问题。 #include #include #include typedef struct { int a,b; } s_param; void * threadfunc(void *parm) { s_param *param2 = parm; printf(“ID:%d and v:%d\n”,param2->a,param2->b); pthread_exit(NULL); } int main(int argc, char **argv) { pthread_t thread[3]; int rc=0,i; void * status; for(i=0; i<3 ; ++i){ s_param param; param.b=10; param.a=i; rc = pthread_create(&thread[i], NULL, threadfunc, &param ); […]

虚假唤醒后的互斥状态

考虑使用pthreads这个基本的multithreading程序。 我们有一个主线程,创建另一个做一些工作的线程。 bool done = false; mutex m; condition c; void foo() { pthread_mutex_lock(&m); //while(!done) { pthread_cond_wait(&c, &m); // Spuriously wakeup while child is doing work. // child thread has NOT unlocked the mutex yet // Do I now own the mutex? // or am I waiting for child to unlock it? //} pthread_mutex_unlock(&m); } […]

如何使用pthread_exit()重用线程

我的电脑每个进程允许380个线程,这对我来说很好。 当我调用380次函数sdfpthread_create()时,我没有问题。 但是连续调用返回错误11(资源暂时不可用)。 明显的解决方案是使用pthread_exit(),但我没有解决问题,限制仍然是380个线程创建。 我如何重用线程? #include #include #include #include #include void *doSomeThing() { sleep(99); pthread_exit(NULL); } int main(void) { pthread_t tid; int i; int err; /* Create threads */ for (i=0; i<380; ++i) { err = pthread_create(&tid, NULL, doSomeThing, NULL); if (err != 0) printf("\n1) Can't create thread :[%s]", strerror(err)); } sleep(1); /* Reuse threads […]

使用pthread_cond_wait和pthread_cond_signal保证屈服

假设我有一个带有3个POSIX线程的C程序,共享一个全局变量,互斥量和条件变量,其中两个执行以下伪代码: …process data… pthread_mutex_lock( &mutex ); variable = data_ptr; pthread_cond_signal( &cond ); pthread_mutex_unlock( &mutex ); 第三次运行: while(1) { while( variable == NULL ) { pthread_mutex_wait( &cond, &mutex ); } printf( “Data is %d”, *variable ); } 假设第三个线程将看到前两个中的每一个的数据是否安全? 换句话说,如果一个线程在互斥锁和一个条件变量上作用,是否可以安全地假设它是下一个获取锁定的信号,而不是一个其他可能正在等待的线程。锁?

pthread退出时运行函数

我有一个C ++应用程序,我在其中创建pthread来运行用户提供的函数。 我希望能够在线程退出时以某种方式发出警报,以便我可以从我用来保留线程的pthread数组中删除它。 有没有办法做到这一点,或者该function是否应该设置一些“神奇的价值”。 因为生成pthreads的主代码是在某种runloop中,所以我可以轻松检查退出条件。 另外,使用std::vector overdoing来跟踪我的线程是否过载? 线程数不一定是任何类型的常量,许multithreading或极少数线程可以运行。 或者是否有另一个STL容器可以用于这些添加和删除(总是在一端添加,几乎在任何地方删除)。 是否有其他结构可以跟踪pthreads? 堆栈或列表是否就在这里? 还是一个标准的Carrays,最大限度的慷慨? 由于问题的本质,我还可以维护一个固定大小的工作线程数组,我传递给必须执行的用户函数。 这是一个好的解决方案吗? 很抱歉这个长期困惑的问题,但我只使用动态语言中的线程,这绝不是一个问题。 编辑(2012年8月3日):在阅读@ jojojapan的回答后,我决定使用各种线程池。 在我的结构中,我有一个生产者(runloop中的一个线程)和许多消费者(池中的工作线程)。 是否存在针对multithreading单一生产者多消费者使用的数据结构? 或者我只是使用带有pthread_mutex_t的std::queue吗?

pthread互斥的必要性

我有一个int array[100] ,我想要5个线程来计算所有数组元素的总和。 每个线程在其专用范围内迭代20个元素,并将总和写入全局sum变量。 这是必需的互斥体吗? 由于所有线程都从独立源读取,因此不需要同步。 for(i=offset; i<offset+range; i++){ // not used pthread_mutex_lock(&mutex); sum += array[i]; // not used pthread_mutex_unlock(&mutex); } 这会导致不可预测的行为,还是操作系统实际上会处理这个问题? 在这种情况下,是否可以省略互斥锁? 我注意到没有它,这些算法运行得更快。

使用pthreads进行条件等待

我似乎正在使用pthreads条件变量运行可能的死锁。 这是代码 thread function(){ for (condition){ do work /* should the thread continue? */ if (exit == 1){ break; /* exit for */ } } /* end for */ pthread_mutex_lock(&mtxExit); exit = 0; pthread_cond_signal(&condVar); pthread_mutex_unlock(&mtxExit); } 主要function如下: function main(){ if (thread is still active){ pthread_mutex_lock(&mtxExit); exit = 1; pthread_mutex_unlock(&mtxExit); } /* end if */ while […]

大量互斥体的性能影响

假设我有一个包含1,000,000个元素的数组,以及一些工作线程,每个线程操作此数组中的数据。 工作线程可能正在使用新数据更新已填充的元素,但每个操作仅限于单个数组元素,并且与任何其他元素的值无关。 使用单个互斥锁来保护整个arrays显然会导致高争用。 在另一个极端,我可以创建一个与原始数组长度相同的互斥量数组,对于每个元素array[i]我会在操作时锁定mutex[i] 。 假设数据均匀分布,这将主要消除锁争用,代价是大量内存。 我认为更合理的解决方案是拥有一组n互斥体(其中1 <n <1000000)。 然后对于每个元素array[i]我会在操作时锁定mutex[i % n] 。 如果n足够大,我仍然可以最小化争用。 所以我的问题是,除了增加的内存使用量之外,以这种方式使用大量(例如> = 1000000)数量的互斥量会有性能损失吗? 如果是这样,在开始看到退化之前,您可以合理使用多少互斥锁? 我相信这个问题的答案有点特定于平台; 我在Linux上使用pthreads。 我也在努力建立自己的基准测试,但是我正在研究的数据规模使得这个时间非常耗时,因此我们会对一些初步指导意见表示赞赏。 这是最初的问题。 对于那些要求提供有关该问题的更详细信息的人,我有4个多GB二进制数据文件,描述了正在分析的5亿个事件附近的某个地方。 有问题的数组实际上是支持非常大的链式哈希表的指针数组。 我们将四个数据文件读入哈希表,如果它们共享某些特征,则可能将它们聚合在一起。 现有实现有4个线程,每个线程读取一个文件并将该文件中的记录插入到哈希表中。 哈希表有997个锁和997 * 9973 = ~10,000,000个指针。 当插入带有散列h的元素h ,我首先在插入或修改bucket[h % 9943081]的元素bucket[h % 9943081]之前锁定mutex[h % 997] bucket[h % 9943081] 。 这可以正常工作,据我所知,我们没有太多的争用问题,但是存在性能瓶颈,因为我们只使用16核机器的4核。 (因为我们的文件通常不是都大小相同,所以更少。)一旦所有数据都被读入内存,我们就会分析它,它使用新线程和一个新的锁定策略调整到不同的工作量。 我试图通过切换到线程池来提高数据加载阶段的性能。 在新模型中,我仍然为每个文件都有一个线程,它只是以~1MB块的forms读取文件,并将每个块传递给池中的工作线程进行解析和插入。 到目前为止,性能提升很小,我所做的分析似乎表明锁定和解锁arrays所花费的时间可能是罪魁祸首。 锁定内置于我们正在使用的哈希表实现中,但它允许指定独立于表大小使用的锁数。 我希望在不改变哈希表实现本身的情况下加快速度。

pthread_kill()包含无效的线程

我想确定一个特定的线程是否“存在”。 pthread_kill()似乎适合此任务,至少根据其手册页 。 如果sig为0,则不发送任何信号,但仍会执行错误检查。 或者,正如我的系统的手册页所示: 如果sig为0,则不发送信号,但仍然执行错误检查; 这可以用于检查是否存在线程ID。 但是,当我尝试传入未初始化的pthread_t ,应用程序总是SEGFAULTs。 深入研究,来自pthread_kill.c (来自我的工具链)的以下片段似乎没有进行错误检查,只是尝试取消引用threadid (取消引用是在pd->tid )。 int __pthread_kill (threadid, signo) pthread_t threadid; int signo; { struct pthread *pd = (struct pthread *) threadid; /* Make sure the descriptor is valid. */ if (DEBUGGING_P && INVALID_TD_P (pd)) /* Not a valid thread handle. */ return ESRCH; /* Force load […]

pthread:加入一个分离的线程没有正确设置errno

我正在检查’pthread_join’的行为并拥有以下代码: #include #include #include #include #include void *thread(void *vargp) { pthread_detach(pthread_self()); pthread_exit((void *)42); } int main() { int i = 1; pthread_t tid; pthread_create(&tid, NULL, thread, NULL); sleep(1); pthread_join(tid, (void **)&i); printf(“%d\n”, i); printf(“%d\n”, errno); } 在我的平台上观察到的输出(Linux 3.2.0-32-generic#51-Ubuntu SMP x86_64 GNU / Linux): 用’sleep(1)’注释掉:42 0 使用sleep语句,它产生:1 0 根据pthread_join的手册页,当我们尝试加入一个不可连接的线程时,我们应该得到错误’ EINVAL ‘,但是,上面两种情况都没有设置errno。 而且在第一种情况下,似乎我们甚至可以获得分离线程的退出状态,我对结果感到困惑。 谁能解释一下呢? 谢谢 [编辑]:我意识到第一个printf可能会重置’errno’,但是,即使我交换了两个’printf’语句的顺序后,我仍然得到了相同的结果。