想做一个关于服务器程序,涉及收发消息和读写文件。计划用三线程来实现,三线程说明如下:
1. 主线程:负责接收消息,以及逻辑处理,进行读文件和写文件。由于读写文件非常耗时,避免卡死所以分给子线程来做。
2. 读线程:负责读文件。
3. 写线程:负责写文件。
然后问题就来了,主线程读完文件之后,不是只为读而读,读完还要做处理。但是,该方案中读文件是给读线程做的,主线程难道要不断等待,等读线程读完了才继续执行下去?这样的话就跟单线程没有区别了。
写文件也一样,写时发生错误的话,主线程还是有后续操作的,难道又是等待?
于是,我想用触发的方式来解决。即读完文件后,由读线程来触发主线程未完成的操作。这样问题是解决了,但程序架构会很散,很累赘,不知道好不好。
所以,求教一下大家,有没有什么好的方案,既能避免主线程因读写文件而卡很久,又能有好的程序架构,而且看起来专业。
或者有什么资料可以参考一下?
12 个解决方案
读写放入子线程中,处理可以在主线程中,也可以还在子线程中。主线程和子线程通过事件、标志等通信。
这样不行吗?一个线程读,一个线程写....你主线程该干嘛干嘛...
主线程只负责接收消息,具体的处理都交给某一个线程来做,可以开多个线程同时处理多个客户请求。
利用自定义消息,主线程把工作交给子线程然后继续工作。读线程读完后发消息给主线程。主线程收到后处理,完成后继续工作。读和写互斥。
主线程只负责消息的收发和任务的安排,具体工作交给读写线程来处理
线程之间可以用消息,也可以用全局变量来交换数据
谢谢楼上几位, 说得有道理, 确实可以让主线程只负责消息, 具体工作交给线程来做.
不过估计细节上还会有问题, 先不管, 做了再说.
如果消息来的快,可以考虑有一个消息队列,之后让主线程循环的到队列中拿消息,当然是在子线程完成一个消息再通知主线程。
可以这样设计:
首先有两个栈,读、写,这两个栈用来存放要读写文件的相关信息。
有一个线程用来接收网络上的消息,并把消息分成读、写,当是读消息时,把要读的相关信息压入读栈,如果是写文件信息,就把要写入文件的相关信息压入写栈。
有一个读线程,一个写线程。
读线程循环的从读栈中取消息(pop),取出一条处理一条。
写线程循环的从写栈中取消息(pop),取出一条处理一条。
压栈和出栈的时候,要有同步处理过程,因为你要压栈,又要从栈中取出一条并删除,是互斥的。