gpt4 book ai didi

python - 如何替换Windows中的posix闹钟

转载 作者:行者123 更新时间:2023-11-30 17:38:45 27 4
gpt4 key购买 nike

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

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

对我来说,在 POSIX 操作系统中执行此操作非常简单:每个线程(但主线程)都会为 SIGALRM 设置处理程序, SIGUSR1SIGUSR2 。它还将设置 alarm(x)while (1): pause()SIGALRM处理程序将打印消息并设置 alarm(x)SIGUSR1处理程序将通过设置remaining_time = alarm(0)来暂停线程和pause()SIGUSR2处理程序将通过设置 alarm(remaining_time) 来继续线程。主线程会发送SIGUSR1当收到输入freeze i时并发送SIGUSR2收到continue i时.

但我找不到在 Windows 中执行此操作的方法。请帮助我找到正确的方法来做到这一点!据我了解,它应该与 POSIX 的方式完全不同,但我找不到合适的解决方案。

最佳答案

选项 1(推荐)

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

--

选项 2

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

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

--

选项 3

另一个解决方案是只为每个线程关联一个 CRITICAL_SECTION 锁。线程实现看起来像这样:

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

“卡住”和“继续”的实现是调用 EnterCriticalSection() - 从而阻止线程继续。

关于python - 如何替换Windows中的posix闹钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22048512/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com