主线程挂起与唤醒的问题

时间:2022-03-17 14:33:35
全局变量:HANDLE hMainThread;

在主函数中:
hMainThread = GetCurrentThread();
...
SuspendThread( hMainThread );
p:...

在子线程中:
if( ... )
    ResumeThread( hMainThread );

这样能唤醒主线程嘛?
主线程是从p处开始执行吗?

7 个解决方案

#1


按道理是可以在其他线程启动主线程的,问题是确保子线程已经启动,并能确保结束前能激活或创建其它有效的线程,避免程序陷入无反应状态!

#2


这种情况还不如主线程中WaitForSingleObject等待子线程触发,而不是暂停主线程,以免引起程序阻塞

#3


你的理解是正确的。

不过很奇怪,你为什么要暂停主线程呢?

#4


如果有界面的话,又要等待子线程的某个时间,使用MsgWaitForMultipleObjects函数。
既能达到你的目的,又不影响系统界面的响应

#5


因为我要取用N个子线程的结果作为主线程下一步处理之用。
用waitForMultipleObjects函数可以实现我的功能。

但是存在另外一个问题就是:
每次ResumeThread之后,子线程是重新执行一遍呢,还是从头到尾只执行一遍呢?

此外:
子线程中有大量的堆操作,如何使各个线程共享这些空间,就像单线程一样。

#6


我需要在主线程中循环执行子线程
while( ... )
{
   ...

   for(int i = 0; i < n; ++i )
   {
      ResumeThread(hHandle[i]);
   }
 
   WaitForMutilpleObjects( n, hHandle, TRUE, INFINIT );

   ...
}

这样的代码能够实现循环执行子线程嘛?
也就是每次ResumeThread之后子线程都能像被调用一次似的执行一遍嘛?

#7


1.   但是存在另外一个问题就是:
     每次ResumeThread之后,子线程是重新执行一遍呢,还是从头到尾只执行一遍呢? 
 从上次执行为位置开始执行。

2.子线程中有大量的堆操作,如何使各个线程共享这些空间,就像单线程一样。
   进程中的变量,各个线程都是可以访问到得,因为变量的地址在进程中是唯一的。

3. 这样的代码能够实现循环执行子线程嘛?
也就是每次ResumeThread之后子线程都能像被调用一次似的执行一遍嘛?

 如果你仅仅是想让某个函数在子线程中循环执行,你没必要那样子做。在你的子线程设置一个循环,使用WaitForMutilpleObjects函数,接受主线程的控制。

#1


按道理是可以在其他线程启动主线程的,问题是确保子线程已经启动,并能确保结束前能激活或创建其它有效的线程,避免程序陷入无反应状态!

#2


这种情况还不如主线程中WaitForSingleObject等待子线程触发,而不是暂停主线程,以免引起程序阻塞

#3


你的理解是正确的。

不过很奇怪,你为什么要暂停主线程呢?

#4


如果有界面的话,又要等待子线程的某个时间,使用MsgWaitForMultipleObjects函数。
既能达到你的目的,又不影响系统界面的响应

#5


因为我要取用N个子线程的结果作为主线程下一步处理之用。
用waitForMultipleObjects函数可以实现我的功能。

但是存在另外一个问题就是:
每次ResumeThread之后,子线程是重新执行一遍呢,还是从头到尾只执行一遍呢?

此外:
子线程中有大量的堆操作,如何使各个线程共享这些空间,就像单线程一样。

#6


我需要在主线程中循环执行子线程
while( ... )
{
   ...

   for(int i = 0; i < n; ++i )
   {
      ResumeThread(hHandle[i]);
   }
 
   WaitForMutilpleObjects( n, hHandle, TRUE, INFINIT );

   ...
}

这样的代码能够实现循环执行子线程嘛?
也就是每次ResumeThread之后子线程都能像被调用一次似的执行一遍嘛?

#7


1.   但是存在另外一个问题就是:
     每次ResumeThread之后,子线程是重新执行一遍呢,还是从头到尾只执行一遍呢? 
 从上次执行为位置开始执行。

2.子线程中有大量的堆操作,如何使各个线程共享这些空间,就像单线程一样。
   进程中的变量,各个线程都是可以访问到得,因为变量的地址在进程中是唯一的。

3. 这样的代码能够实现循环执行子线程嘛?
也就是每次ResumeThread之后子线程都能像被调用一次似的执行一遍嘛?

 如果你仅仅是想让某个函数在子线程中循环执行,你没必要那样子做。在你的子线程设置一个循环,使用WaitForMutilpleObjects函数,接受主线程的控制。

相关文章