填充大小列表,pthreads弹出列表
populating list at size with pthreads popping off list
>我有一个单链表,每个元素包含 1 个值。
struct listElement
{
char guid[20];
struct listElement *next;
struct listElement *last;
int numElements;
};
该代码在池中启动 10 个 pthread,这些线程都pthread_cond_wait()
元素添加到列表中。
我的 main() 是从文件中读取字符串,一次一行,并通过调用listPush(val)
填充链表
listPush(val)
获取 lock,创建新元素,添加到列表末尾(如果为空则创建 head),然后调用 pthread_cond_signal()
让 10 个线程中的一个知道现在有一个元素需要完成工作。
在 numElements> numThreads 的情况下,我调用pthread_cond_broadcast()
因为每个线程应该有足够的工作来弹出和运行。
每个线程listPop(rVal)
一个值(锁定、删除、修复指针、解锁)并处理它,然后返回到pthread_cond_wait()
状态。
我的文件大约有 2 亿行。(1.2GB)我不希望我的链表变得这么大,所以我试图"限制"链表的大小。
在listPush()
里面,在我锁定互斥锁之前,我有
if(head && head->numElements >= maxNumElements)
{
while(head && head->numElements >= maxNumElements)
{
sleep(1);
}
}
这个想法是,如果我"填满"我的列表,我会等待线程处理其中的一大块,然后再添加更多。我已经到了应用程序开始"脉冲"的地步;基本上我可以看到它等待 1 秒。我希望这种情况永远不会发生或很少发生。
除了使用 sleep()
之外,有没有更好的方法来限制我的列表的大小?
这听起来像是一个经典的生产者-消费者问题。解决方案是在列表太大时listPush()
等待条件变量。然后,一旦使用列表元素,其中一个使用者线程可以向此条件变量发出信号。
一种完全不同的方法是仅使用pipe()
来处理通信和同步。这将消除对链表和互斥锁的需求。
是的,与其使用睡眠,不如等待信号量(类似于互斥锁,但以另一种方式),并在将新元素添加到列表时被唤醒。您也许可以找到事件库或使用 pthreads 自己完成。
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 填充大小列表,pthreads弹出列表
- 使用PThreads访问全局列表-指针问题