通知线程有关变量的变化(信号?)

时间:2014-02-01 10:40:41

标签: c++ c multithreading pthreads

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

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

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

有一种简单的方法吗?类似于中断?信号怎么样?

主要内部的功能:

int main()
{

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

}

如果有人可以给我一个例子那就太棒了! 谢谢!

3 个答案:

答案 0 :(得分: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
         }
    }
}

答案 1 :(得分:1)

由于您已经在使用pthread库,因此您可以使用条件变量来告诉线程有数据可供处理。有关详细信息,请查看this StackOverflow question

答案 2 :(得分:1)

我知道您不希望无限期等待此通知,但C ++仅实现协作调度。你不能只是暂停一个线程,摆脱它的记忆,然后恢复它。

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

线程有多种方法来检查信号:

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

根据您的要求,我认为队列可能是这三者中最好的想法。