InterThread通讯

时间:2011-09-05 05:33:55

标签: c++ multithreading winapi ipc

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

脚本文件的格式如下。

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.

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

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

  1. 监听器线程 - 它将从服务器接收数据。(此处使用select())
       它将在程序遇到connect命令时启动,并在执行时关闭    在配置中遇到断开连接
  2. 主线程,它将从配置文件中读取命令并执行。
  3. 现在遇到匹配主线程时应该将匹配字符串发送给 侦听器线程用于匹配并在那里等待来自侦听器线程的信号。

    监听器线程将匹配字符串与从服务器接收的数据(如果匹配)将单个事件(SetEvent()窗口)单个主线程,然后主线程将记录“匹配找到”其他方式如果时间被删除然后它将记录为“未找到匹配”

    我想到了一个全局变量char * g_MatchString。每当有匹配命令并且等待事件(windows事件)被单独并且等待时间将等于匹配时间时,主线程将更新此变量。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

由于主线程在侦听器线程上等待,并且侦听器线程的唯一目的是读取入站数据,我建议完全删除侦听器线程并让主线程直接读取。