线程间通信

InterThread communication

本文关键字:通信 线程      更新时间:2023-10-16

我正在工作的客户端服务器应用程序,我需要从脚本文件发送命令读取。

脚本文件格式如下:

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.

当遇到匹配命令时,程序应该等待匹配指定的秒,然后继续下一个命令。

我有两个线程在应用程序中运行

  1. 监听线程——它将从服务器接收数据(这里使用select())
    当程序遇到connect命令时启动,当
    在配置中遇到断开连接。
  2. 主线程,将从配置文件中读取命令并执行。

现在,当遇到匹配时,主线程应该将匹配字符串发送到监听线程进行匹配,等待来自监听线程的信号。

监听线程将字符串与从服务器接收到的数据匹配,如果匹配,它将单个事件(SetEvent() windows)到主线程,然后主线程将记录"匹配找到",否则,如果时间是有限制的,那么它将记录为"匹配未找到"

我想有一个全局变量char* g_MatchString。主线程将更新这个变量,只要有match命令,等待事件(windows事件)被选中,等待时间将等于match时间。

我需要你们的意见,看看我的方法是否正确。

不要使用全局变量。当有人在未来增加复杂性时,这只会产生竞争条件的可能性。匹配字符串应该作为输入参数传递给线程。您不必说明如何启动线程,但如果使用_beginthread(),只需分配一个缓冲区并将其传递给arglist参数中的_beginthread()。当侦听器线程终止时,主线程可以安全地释放匹配字符串缓冲区。这使它很好地保持了自包含,并且在添加额外线程时避免了潜在的竞争条件。如果你用CreateThread()启动线程,你可以通过lpParameter参数传递它。

除了全局,我认为你的方法是合理的。

由于主线程正在等待侦听器线程,而侦听器线程的唯一目的是读取入站数据,因此我建议完全摆脱侦听器线程,让主线程直接进行读取。