线程间通信
InterThread communication
我正在工作的客户端服务器应用程序,我需要从脚本文件发送命令读取。
脚本文件格式如下:
CONNECT <www.abcd.com,80>
SEND : AB 40 01 FF 00 00 00 09 01 01 07 00 00 C0 A8 01 87 AE
MATCH<s,10>: AB 40 01 FF 00 00 00 09 01 01 07 00 00 C0 A8 01 87 AE
SEND : AB 34 01 FF00 00 00 0C 01 01 07 00 01 01 07 00 FF FF FF FF AE
DISCONNECT
note: s in match is wait time in seconds.
here second byte is Msg ID.
当遇到匹配命令时,程序应该等待匹配指定的秒,然后继续下一个命令。
我有两个线程在应用程序中运行
- 监听线程——它将从服务器接收数据(这里使用select())
当程序遇到connect命令时启动,当
在配置中遇到断开连接。 - 主线程,将从配置文件中读取命令并执行。
现在,当遇到匹配时,主线程应该将匹配字符串发送到监听线程进行匹配,等待来自监听线程的信号。
监听线程将字符串与从服务器接收到的数据匹配,如果匹配,它将单个事件(SetEvent() windows)到主线程,然后主线程将记录"匹配找到",否则,如果时间是有限制的,那么它将记录为"匹配未找到"
我想有一个全局变量char* g_MatchString。主线程将更新这个变量,只要有match命令,等待事件(windows事件)被选中,等待时间将等于match时间。
我需要你们的意见,看看我的方法是否正确。
不要使用全局变量。当有人在未来增加复杂性时,这只会产生竞争条件的可能性。匹配字符串应该作为输入参数传递给线程。您不必说明如何启动线程,但如果使用_beginthread(),只需分配一个缓冲区并将其传递给arglist参数中的_beginthread()。当侦听器线程终止时,主线程可以安全地释放匹配字符串缓冲区。这使它很好地保持了自包含,并且在添加额外线程时避免了潜在的竞争条件。如果你用CreateThread()启动线程,你可以通过lpParameter参数传递它。
除了全局,我认为你的方法是合理的。
由于主线程正在等待侦听器线程,而侦听器线程的唯一目的是读取入站数据,因此我建议完全摆脱侦听器线程,让主线程直接进行读取。
相关文章:
- C++一个线程如何正确通信其任务已完成?
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 线程之间的通信不起作用 - C++
- 关于套接字通信的线程
- ZeroMQ:如何使用inproc减少多线程通信延迟
- 用于线程间通信的 Windows 套接字
- 与处理 ZeroMQ 的永久线程与 Qt 通信
- 与非主线程的 GUI 线程通信
- 使用 C++14 和 GLib (GDBus) 的线程通信
- 使用Protobuf进行线程通信
- C 14中的乘数交叉线程通信
- 串口读取功能的通信超时和线程不超时
- 使用PTHREDS与C 进行线程通信
- Qt中的多线程通信
- 远程、IPC 和线程场景中微服务的低延迟通信
- C++ - 多线程 - 线程之间的通信
- 线程中的通信丢失
- 与OpenSSL的多线程通信
- main()和线程()之间的通信
- Qt多线程通信