Tag: multithreading

如何将for循环的索引作为pthread_create的参数传递

我正在使用for循环来创建多个线程并将索引i作为参数传递,如下所示: pthread_t p[count]; for (int i = 0; i < count; i++){ pthread_create(&p[i], NULL, &somefunc, (void*)&i); } 然后我尝试检索i的值: void *somefunc (void* ptr){ int id = *(int*)ptr; } 但是,我注意到有时候,线程中的id会有重叠值,我怀疑是由于for循环更新的索引在线程能够检索值之前(因为我传入了指针,而不是值本身)。 有没有人有任何建议来克服这个问题,而不会减慢for循环? 谢谢

虚假唤醒后的互斥状态

考虑使用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); } […]

将multithreading添加到这个简单算法的有效方法是什么?

我会说我在C中的知识是公平的,我希望扩展一个程序来增强我对并行编程的了解。 它本质上是我所指的程序是一个powershell生成器,通过密码增加,例如来自0000 .. zzzz的特定字符集: 需要帮助用于地下室的powershell代码(3) 该算法概述如下(为此归功于杰罗姆) int len = 3; char letters[] = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz”; int nbletters = sizeof(letters)-1; int main() { int i, entry[len]; for(i=0 ; i<len ; i++) entry[i] = 0; do { for(i=0 ; i<len ; i++) putchar(letters[entry[i]]); putchar('\n'); for(i=0 ; i<len && ++entry[i] == nbletters; i++) entry[i] = 0; } while(i<len); } […]

使用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互斥的必要性

我有一个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); } 这会导致不可预测的行为,还是操作系统实际上会处理这个问题? 在这种情况下,是否可以省略互斥锁? 我注意到没有它,这些算法运行得更快。

多次并行调用函数

我想多次调用具有不同arg值的函数。 为了使执行更快,我想调用函数而不考虑它的实现。 在循环内部我将arg传递给函数并调用它现在我的程序不应该等待函数执行并再次循环,而是它不应该认为函数没有完成第一个循环它应该继续并调用一次又一次地起作用直到循环结束。 如何使用fork和threads来做到这一点,哪一个更快,一个代码框架会有帮助? 让我说我的函数是void foo(arg1,arg2)

大量互斥体的性能影响

假设我有一个包含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所花费的时间可能是罪魁祸首。 锁定内置于我们正在使用的哈希表实现中,但它允许指定独立于表大小使用的锁数。 我希望在不改变哈希表实现本身的情况下加快速度。

如何将Mandelbrot的每个像素计算划分为不同的节点?

我的问题是我应该使用什么数据结构将工作分配给每个线程并从中获取计算值。 在我看来,第一件事是填充矢量[0] ..矢量[63999](对于800×800像素),其结构包含x,y和iterate_value。 将这些向量传递给每个节点 – >然后将给定向量进一步划分到每个核心(Os-thread) – >然后将给定向量进一步划分到每个线程。 有没有其他可能的方式来发送和接收值? 如果我以矢量方式进行,我应该通过传递值传递矢量还是通过引用传递,在这种情况下哪一个更好?

如何将元素从字符串数组传递给线程?

需要一些帮助来解决“将元素从字符串数组传递给线程”的问题。 我的代码是在这个文本之后。 我在main函数中声明了一个字符串数组,然后将一个数组元素传递给一个线程。 在线程中我将它转换回char *类型然后打印,但它打印垃圾值。 将不胜感激解决方案: #include #include void *agent(void *); int main(int argc, char *argv[]) { int i; pthread_t agent_t[3]; char *agent_colour[3] = {“Red”,”White”,”Brown”}; for(i = 0 ; i <= 2 ; i++) { pthread_create(&agent_t[i], 0, agent, &agent_colour[i]); } for(i = 0 ; i <= 2 ; i++) { pthread_join(agent_t[i], NULL); } return 0; […]

OpenMP Producer-Consumer意外结果

我正在研究一个简单的生产者 – 消费者问题,在C中使用OpenMP。 我的程序创建了4个线程,其中两个是消费者,两个是生产者。 每个制作人将一个角色放在一个缓冲区中,消费者只需打印该角色。 我的目标是同步生产者/消费者,以便每个生产者将生成字母表中的下一个按顺序字符,并且每个消费者将打印放置在缓冲区中的下一个按顺序字符。 这是我的代码: #include #include #include #define SIZE 5 #define NUMITER 26 char buffer[SIZE]; int nextin = 0; int nextout = 0; int count = 0; int empty = 1; int full = 0; int i,j; void put(char item) { buffer[nextin] = item; nextin = (nextin + 1) % SIZE; count++; […]