首页 > 解决方案 > 如何控制同一个pthread的多个实例来处理一个顺序列表

问题描述

我有一个链表,它将由同一pthread的n 个实例处理。

线程将不断地从列表中删除一个项目,并根据类型将其移动到第二个列表,为其分配一个由函数生成的顺序参考号。编号必须按照与从列表中删除的项目相同的顺序分配。

我将不胜感激有关如何解决此问题的一些想法。问题是线程正在为从列表中删除的项目分配无序的参考编号。请考虑包含 A1、A2、A3 的列表。线程n1删除 A1,获取参考编号 1 并将其与项目 A1 关联。线程n2删除项目 A2,线程n3删除项目 A3;在线程n2获得参考编号 2 之前,线程n3已经获得它,因此当线程n2获得参考编号时,它将是参考编号 3。

结果是:{{A1, 1}, {A2, 3}, {A3, 2}} 这是不正确的。我尝试过使用条件变量,但对我来说有意义的唯一方法是在调用pthread_cond_wait()之前调用pthread_cond_broadcast(),这显然是不合逻辑的,这个想法类似于不要让任何线程从中获取项目列表直到最后一项被处理. 我已经实现了一个版本,它跳过 pthread_cond_signal() 如果它是第一个运行的线程,然后点击 pthread_cond_wait() 直到第二个线程运行 pthread_cond_broadcast(); 它比没有条件变量的情况更好,但结果不是恒定的。有时对于 2 或 3 个线程可以完美工作,有时对于 2 或 4 个线程,但显然它不起作用。我也使用了互斥变量,但无法实现目标。

谢谢你。

标签: clinuxpthreadsposixmutex

解决方案


推荐阅读