中断主线程并要求它做某事

Posted

技术标签:

【中文标题】中断主线程并要求它做某事【英文标题】:interrupt main thread and ask it to do something 【发布时间】:2015-07-15 09:38:15 【问题描述】:

我想知道是否可以中断主线程并要求它执行一些回调。完成回调后,主线程应该继续它正在做的事情。

例如,我们有 2 个线程 t1 和 m1(主线程)。 t1 将中断 m1(主线程)并要求它调用带有一些参数的函数。 m1(主线程)将停止执行它之前正在执行的操作并开始执行该函数。完成该功能后,它会恢复到之前的状态。

我想复制硬件中断的作用。我有一个从文件中读取数据的线程。然后它应该要求主线程调用一个函数。主线程将做一些事情。它应该停止这样做并开始执行该功能。完成后,主线程应该继续它正在做的事情

【问题讨论】:

基本上没有,但实际上也没有。 只需编写您想要的代码。你遇到了什么障碍? (如果您需要更多帮助,了解您正在使用的线程库或标准将非常有用。C++11?POSIX?Windows?) 基本上我想要硬件中断的作用。我有一个从文件中读取数据的线程。然后它应该要求主线程调用一个函数。主线程将做一些事情。它应该停止这样做并开始执行该功能。完成后,主线程应该继续它正在做的事情 我现在正在使用 windows 库。我稍后会为 linux (pthread) 做这个 我已经更新了我的问题。请看 【参考方案1】:

我认为一个干净的方法是让 t1 添加到一个操作队列,t2 在其处理循环中可以安全地开始执行其他操作的点进行检查。

在 POSIX 系统上,您可以使用信号。例如,以下启动第二个线程,当主线程在做其他工作时,第二个线程向它发送一个SIGUSR1 信号。主线程处理它并恢复操作。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>

void* other_thread(void* main_thread) 
  printf("other_thread: %x\n", pthread_self());
  usleep(250*1000);
  printf("sending SIGUSR1 to main thread...\n");
  pthread_kill((pthread_t) main_thread, SIGUSR1);
  return NULL; 


void my_handler(int signal) 
  printf("my_handler: %x\n", pthread_self());
  sleep(2);
  printf("back to main\n");


int main(int argc, char**argv) 

  signal(SIGUSR1, my_handler);

  pthread_t thread1;
  pthread_create(&thread1, NULL, other_thread, pthread_self());

  printf("main: %x\n", pthread_self());
  int x = 0;
  while (1) 
    // sleep(1), or do some work, or:
    x++;
    if (x % 10000000 == 0) printf("boo\n");
  

【讨论】:

基本上我想要硬件中断的作用。我有一个从文件中读取数据的线程。然后它应该要求主线程调用一个函数。主线程将做一些事情。它应该停止这样做并开始执行该功能。完成后,主线程应该继续使用队列做的事情是选项,但我正在寻找的是像硬件一样的中断 在 Linux 上,我会说尝试看看使用 signals 是否有帮助。"`SIGUSR1 和 SIGUSR2 信号被预留给您以供您使用任何您想要的方式。它们对于简单的操作很有用进程间通信,如果您在接收信号的程序中为它们编写信号处理程序。"

以上是关于中断主线程并要求它做某事的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 executor.execute 和 future.get() 结束任务(使线程超时)(通过上升中断)而不阻塞主线程

如何从主线程超时java线程?

如何从主线程终止子线程[重复]

在没有线程阻塞的情况下回调主线程(Java)

一般来说,主方法main()结束的时候线程结束

C++ - 基本线程问题