如何在不使用全局变量的情况下通知外部线程主线程状态
How to notify outside thread of main thread state without using global variables?
假设我有主线程,它正在运行我的win32过程和一些工作线程来执行由用户点击的函数。
让我们说有一个变化的主要功能(我想要1按钮可用,而另一个不是,但只有当程序进入某种状态(即布尔触发器或那种性质的东西),并通知所有运行的线程,我想禁用终止?)?
将参数传递给线程只捕获主线程在某个时间点的状态。如果我想在不同的时间框架或事件中监视主线程的状态,该怎么办?
我目前有几个全局布尔值来标记/指示程序的当前模式或状态,这就是我如何通知工作线程他们应该如何改变他们的行为。
我应该消除全局变量的使用还是保留它们?或者,如果我应该消除全局变量,我将如何重新实现我的程序?
您仍然可以在构造时向工作线程传递参数。但是不要传递给它拷贝状态变量的(因为正如你所说,它们"只捕获主线程在某个时间点的状态",这是工作线程创建时间)。
将指针(或引用)传递给状态变量。
因为它们是指针,所以你的工作线程可以访问来自主线程的最新数据,而不需要使用全局变量。
下面是一个伪代码示例(没有任何同步机制,如互斥锁):DWORD MyThreadFunction( LPVOID argument );
int main()
{
bool mySyncVar = false;
bool* mySyncVarPtr = &mySyncVar;
CreateThread(
NULL, // default security attributes
0, // use default stack size
MyThreadFunction, // thread function name
mySyncVarPtr, // argument to thread function--NOTE THAT THIS IS
// A POINTER TO THE SYNC VARIABLE
0, // use default creation flags
NULL); // returns the thread identifier
for (...)
{
// Do stuffs
mySyncVar = true; // Will trigger worker thread
// ...
}
return 0;
}
DWORD MyThreadFunction( LPVOID argument )
{
bool* syncPtr = reinterpret_cast<bool*>(argument); // Remember this
// is a pointer
for (...)
{
while (false == *syncPtr)
{
// Wait...
}
// Trigger
// Update your buttons now
}
}
相关文章:
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- C++ Poco - 如何向特定线程发送通知/消息?
- C++ - 如何不错过来自多个线程的多个通知?
- C++ - std::condition_variable 由不同的线程通知
- 线程启动延迟 - 通知所有未唤醒所有线程
- 使用 condition_variable::notify_all 通知多个线程
- 通知所有在多线程C++不起作用.导致死锁
- 通知线程是否始终需要在修改期间锁定共享数据
- 当子线程退出时,如何通知父线程
- QSocketNotifier:不能从另一个线程启用或禁用套接字通知程序
- 使用Berkeley套接字的线程通知
- 通知有关变量变化的线程(信号?)
- 用信号通知线程启动特定的函数
- 线程退出时通知Waiters
- C++11 std::condition_variable:我们可以将锁直接传递给通知的线程吗?
- 通知线程退出
- std::condition_variable - 等待多个线程通知观察者
- 线程之间的更改通知标志需要内存屏障吗
- 视觉提升 条件变量中的同步队列C++不通知其他线程上的等待类方法
- c++主线程通知线程通知主线程