c - 如何控制同一个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 个线程,但显然它不起作用。我也使用了互斥变量,但无法实现目标。
谢谢你。
解决方案
推荐阅读
- vue.js - 垂直滚动时更新 vuetify 导航抽屉中的选定项目
- java - 如何在弹出的模式中单击确认按钮
- mongodb - Microsoft Cosmosdb for Mongodb:将未分片的集合合并到分片的集合中
- excel - 如何使循环从另一张表中提取值?
- http - 我无法让我的子路由器正常工作
- javascript - 如何使用 if/else 语句编写 javascript 函数来检查是否存在类包含一个或类
- reactjs - 在 React 组件中的多个 GraphQL 查询之间进行更改
- java - JPQL 和实体数据
- react-native - 反应本机:从手机发送数据到另一个没有互联网的手机
- google-analytics - googleanalyticsR:如何获取页面类别(内容组)数据?