Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何控制同一pthread的多个实例来处理顺序列表_C_Linux_Pthreads_Posix_Mutex - Fatal编程技术网

C 如何控制同一pthread的多个实例来处理顺序列表

C 如何控制同一pthread的多个实例来处理顺序列表,c,linux,pthreads,posix,mutex,C,Linux,Pthreads,Posix,Mutex,我有一个链表,它将由相同的pthread的n实例处理 线程将持续从列表中删除一个项目,并根据类型将其移动到第二个列表,为其分配一个由函数生成的顺序参考号。编号的分配顺序必须与从列表中删除项目的顺序相同 我希望你能给我一些建议。问题是线程正在为从列表中删除的项目分配无序的参考号。请考虑包含A1、A2、A3的列表。线程n1删除A1,获取参考号1并将其与项目A1关联。线程n2删除项目A2,线程n3删除项目A3;在线程n2可以获取参考号2之前,线程n3已经获取了它,因此当线程n2获取参考号时,它将成为参

我有一个链表,它将由相同的pthreadn实例处理

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

我希望你能给我一些建议。问题是线程正在为从列表中删除的项目分配无序的参考号。请考虑包含A1、A2、A3的列表。线程n1删除A1,获取参考号1并将其与项目A1关联。线程n2删除项目A2,线程n3删除项目A3;在线程n2可以获取参考号2之前,线程n3已经获取了它,因此当线程n2获取参考号时,它将成为参考号3

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


谢谢。

为什么不能让每个线程锁定一个互斥锁,删除一个列表元素,将列表元素与其编号关联,然后解锁互斥锁?我解决了问题;仍然需要找到一个适当的解决方案。pthread是在循环中创建的。当创建第二个、第三个、第四个等线程时,它不知道线程1执行的互斥锁,因此不尊重它;它直接穿过它。我需要让所有线程在开始处理之前等待最后一个线程。明白了。。。使用pthread_cond_wait可以让所有线程等待信号运行。创建了一个虚拟pthread,在加载后执行pthread_cond_广播。工作得很好。pthread_屏障。。。美丽的!