如何更换windows中的posix报警

2024-05-13 02:41:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个程序,它将有一个正在等待输入的主线程,以及其他一些线程。当用户输入freeze i时,线程号i应该立即暂停-冻结。然后,当用户输入continue i,线程i将继续它正在做的事情。每个线程(但主要线程)的任务是每隔x秒打印一条消息。在

程序最终应该用python编写,但是一个C解决方案,一个伪代码,甚至一些想法都会有很大帮助!在

对我来说,在POSIX操作系统中做这件事非常简单:每个线程(但主线程)都将为SIGALRMSIGUSR1和{}设置处理程序。它还将设置alarm(x)while (1): pause()SIGALRM处理程序将打印消息并设置alarm(x)SIGUSR1处理程序将通过设置remaining_time = alarm(0)pause()来暂停线程。SIGUSR2处理程序将通过设置alarm(remaining_time)继续该线程。主线程在接收输入freeze i时发送SIGUSR1,接收{}时发送SIGUSR2。在

但我在windows中找不到这样做的方法。请帮我找到正确的方法!据我所知,它应该与使用POSIX的方式完全不同,但是我找不到合适的解决方案。在


Tags: 用户程序处理程序time解决方案线程主线posix
1条回答
网友
1楼 · 发布于 2024-05-13 02:41:41

选项1(推荐)

在Windows中,您只需要调用SuspendThread来暂停线程。ResumeThread 把它唤醒。没有比这更容易的了。

选项2

我理解得很正确,您的UNIX代码的警报/信号解决方案本质上是让每个线程在收到主线程的通知后“自挂起”。在

不要使用alarm()、pause()、signal()-同时使用SleepExQueueUserAPC。异步过程调用与UNIX中的信号并不完全相同,但它是一种非常等效的方法,与您现在的实现大致匹配。在

选项3

另一种解决方案是只需要与每个线程关联一个关键节锁。线程实现如下所示:

Thread:
while (true)
{
     Sleep(remaining_time_in_milliseconds);
     EnterCriticalSection(&cs); // enter lock
     printf("message\n");
     LeaveCriticalSection();    // exit lock
}

“freeze”和“continue”的实现是调用EnterCriticalSection()——从而阻止线程继续。在

相关问题 更多 >