如何保证C中的锁定顺序

时间:2015-10-07 04:34:28

标签: c multithreading synchronization

在用户空间中用C编程。

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

我想到的设计是:

我一直在逐字逐句阅读,从inFile中形成一条线。创建一个线程来进行一些字符串操作,最终该线程最终会将新行写入outfile。

显然我必须同步写入outfile的线程;但我还必须以这样的方式同步它们:如果thread1解析line1并且thread2解析line2; thread1应该是首先获取锁定以写入outfile的那个。这样outfile中的文本与infile中的文本行匹配。

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

如何在C中实现这一目标?

2 个答案:

答案 0 :(得分:3)

你不这样做。如果你这样做,每个人都会被阻止,你只是序列化整个过程。

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

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

答案 1 :(得分:1)

您可以在主线程中拥有一个队列。不要写工作线程,让主线程负责读写。启动线程时,将线程放入队列中。当您启动了所需的所有线程时,您可以循环队列并加入线程以获取其结果,并编写输出。 (如果要限制线程数,请限制队列的大小,并在处理队列头部时在队列尾部启动新线程。)如下所示:

for queue_size:
  read line
  if no more lines:
    mark end of file
    break
  launch processing thread
  put thread in queue

while queue not empty:
  pop thread
  join thread
  get results
  write results
  if not end of file:
    read line
    if no more lines:
      mark end of file
      continue
    launch processing thread
    put thread in queue

pthread_join将阻止主线程,直到处理下一行;同时,下行线将继续在后台处理,或等待加入。