c - 如何保证C中的锁定顺序

标签 c multithreading synchronization

在用户空间用 C 编程。

我有一个场景,我正在解析(字符串操作)一个文本文件(infile)以创建另一个文本文件(outfile)。

我想到的设计是:

我不断地逐个字符地阅读以从 inFile 中形成一行。创建一个线程来执行一些字符串操作,最终该线程最终会将新行写入 outfile。

显然,我必须同步正在写入 outfile 的线程;但我还必须以这样的方式同步它们,即如果线程 1 解析 line1,thread2 解析 line2; thread1 应该是第一个获取锁以写入 outfile 的线程。这是为了使 outfile 中的文本与 infile 中的文本行相匹配。

基本上有一个类似于票证的机制,锁定应该检查票证。

我如何在 C 中实现这一点?

最佳答案

你不能那样做。如果这样做,每个人都将被阻止,您只需序列化整个过程即可。

相反,您让解析线程将其结果发布到(线程安全的)优先级队列,然后由单个线程读取该队列以写入文件。

关键因素是解析的行进入优先级队列,其行号是确定优先级的组件,读取队列的线程将跟踪它看到的最后一个行号。然后它查看队列的顶部,检查它是否是“下一行”。如果是,则将其从队列中删除并写入文件。如果没有,它会暂停片刻(可能是快速休眠,或者以某种方式等待下一个队列插入),直到队列顶部实际上是它正在寻找的下一行。

关于c - 如何保证C中的锁定顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32983883/

相关文章:

c - 是否有某种方法可以使 win32 GDI 调用以不同的方式解释坐标?

php - wordpress 数据库的自动同步需要更新它

java - 多线程环境下如何避免同步?

c - 如何将 OpenMP 指令 (#pragmas) 包装为函数或类似函数的宏?

有人可以帮助我编写代码(C 语言)吗?

c - 如何使用递归访问n维数组

c - 为什么线程函数的参数应该在堆中?

c++ - 使用 OpenMP 并行化内部循环

android - 如何使 IntentService 的线程保持 Activity 状态?

optimization - CUDA:同步线程