【问题标题】:notify thread about changes in variable (signals?)通知线程变量(信号?)的变化
【发布时间】:2014-02-01 10:40:40
【问题描述】:

我在同一个程序中有 main() 和线程。

有一个名为“status”的变量,可以获取多个值

我需要当变量发生变化时,通知线程(线程cnat等待状态变量,它已经在做流利的任务了)。

有没有简单的方法可以做到这一点?类似于中断?信号呢?

main里面的函数:

int main()
{

 char *status;
 ... 
 ...
 while (1)
 {
 switch (status)
   {
     case: status1 ...notify the thread
     case: status2 ...notify the thread
     case: status3 ...notify the thread
   }
 }

}

如果有人能给我一个例子,那就太好了! 谢谢!

【问题讨论】:

  • 一次或多次?
  • nofify thread ?意味着您通知线程处理更新的status 值?
  • 不要在 switch 语句中使用char *
  • 次数..不管多少..我需要照顾“状态”变量的变化,每个状态都是我需要采取的不同行动。
  • 让线程检查状态的值,或者你的意思是一个回调函数?

标签: c++ c multithreading pthreads


【解决方案1】:

这个例子可能对你有帮助。

DWORD sampleThread( LPVOID argument );

int main()
{
    bool defValue = false;
    bool* status = &defValue;

    CreateThread(NULL, 0,   sampleThread,  status,  0,NULL);                             

     while(1)
    {
        //.............
        defValue = true; //trigger thread
        // ...
    }

    return 0;
}

DWORD sampleThread( LPVOID argument )
{
    bool* syncPtr = reinterpret_cast<bool*>(argument); 
    while (1)
    {
        if (false == *syncPtr)
        {
            // do something
        }
        else (true = *syncPtr)
        {
            //do somthing else
         }
    }
}

【讨论】:

  • 谢谢.. 但我不能在线程内使用 while (1),因为线程正忙于将数据包传输到另一台计算机。我需要以某种方式通知
  • 我的意思是在 while..loop 中,您的线程将 pkt 传输到另一个系统,当变量从 main 更改时,它会从 main 通知。所以这应该需要对吗?
  • 我用的是视频库,它有视频传输功能,我不能改变这个功能...
  • @jayeshbhoi - 使用while 循环是自找麻烦,因为线程只会在无所事事的情况下消耗 CPU 时间。相反,您需要让线程进入睡眠状态,直到它需要处理某些事情时唤醒。
  • @Sean ohh...我明白了,线程将在主右侧的状态变量更改时唤醒。对于此要求,请 OP 参考 codeproject.com/Articles/21114/Creating-a-C-Thread-Class> 链接
【解决方案2】:

由于您已经在使用pthread 库,您可以使用条件变量告诉线程有数据准备好进行处理。请查看this StackOverflow question 了解更多信息。

【讨论】:

  • 条件变量 do 需要等待它们,但 OP 不希望...
【解决方案3】:

我了解您不想无限期地等待此通知,但是 C++ 仅实现 合作 调度。你不能只是暂停一个线程,摆弄它的内存,然后恢复它。

因此,您首先要了解的是,必须处理您要发送的信号/动作的线程必须愿意这样做;换句话说,这意味着必须在某个时候明确检查信号

线程检查信号有多种方式:

  • 条件变量:它们需要等待信号(这可能是不可取的),但该等待可能会受到持续时间的限制
  • 动作队列(又名通道):您创建一个信号/动作队列,目标线程每隔一段时间就会检查一些事情要做;如果什么都没有,它就继续做它必须做的事情,如果有什么事情你必须决定它是应该做所有事情还是只处理 N 个第一个。当心队列溢出。
  • 只是每隔一段时间直接检查status变量,它不会告诉你它改变了多少次(除非它保留历史:但我们又回到队列中),但它允许你修改你的方式.

鉴于您的要求,我认为 queue 可能是这三个中最好的想法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多