在用户空间中用C编程。
我有一个场景,我正在解析(字符串操作)文本文件(infile)以创建另一个文本文件(outfile)。
我想到的设计是:
我一直在逐字逐句阅读,从inFile中形成一条线。创建一个线程来进行一些字符串操作,最终该线程最终会将新行写入outfile。
显然我必须同步写入outfile的线程;但我还必须以这样的方式同步它们:如果thread1解析line1并且thread2解析line2; thread1应该是首先获取锁定以写入outfile的那个。这样outfile中的文本与infile中的文本行匹配。
基本上有类似票证的机制,锁定应检查票证。
如何在C中实现这一目标?
答案 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
将阻止主线程,直到处理下一行;同时,下行线将继续在后台处理,或等待加入。