Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 中断主线程并要求它做一些事情_C++_C_Multithreading_Asynchronous - Fatal编程技术网

C++ 中断主线程并要求它做一些事情

C++ 中断主线程并要求它做一些事情,c++,c,multithreading,asynchronous,C++,C,Multithreading,Asynchronous,我想知道是否可以中断主线程并要求它执行一些回调。主线程应该在完成回调后继续它正在做的事情 例如,我们有两个线程t1和m1(主线程)。t1将中断m1(主线程),并要求它调用带有一些参数的函数。m1(主线程)将停止它之前所做的工作,并开始执行该函数。函数完成后,它将返回到之前的操作 我想复制硬件中断的功能。我有一个线程从文件中读取数据。然后它应该要求主线程调用一个函数。主线程将执行某些操作。它应该停止执行并开始执行该函数。在完成它之后,主线程应该继续它正在做的事情,我认为这是一种干净的方式,将t1添

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

例如,我们有两个线程t1和m1(主线程)。t1将中断m1(主线程),并要求它调用带有一些参数的函数。m1(主线程)将停止它之前所做的工作,并开始执行该函数。函数完成后,它将返回到之前的操作


我想复制硬件中断的功能。我有一个线程从文件中读取数据。然后它应该要求主线程调用一个函数。主线程将执行某些操作。它应该停止执行并开始执行该函数。在完成它之后,主线程应该继续它正在做的事情,我认为这是一种干净的方式,将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");
  }
}
#包括
#包括
#包括
#包括
void*其他线程(void*主线程){
printf(“其他线程:%x\n”,pthread_self());
usleep(250*1000);
printf(“将SIGUSR1发送到主线程…\n”);
pthread_kill((pthread_t)主线程,SIGUSR1);
返回NULL;
}
无效my_处理程序(int信号){
printf(“my_处理程序:%x\n”,pthread_self());
睡眠(2);
printf(“返回主\n”);
}
int main(int argc,字符**argv){
信号(SIGUSR1,我的_处理器);
pthread_t thread1;
pthread_create(&thread1,NULL,other_thread,pthread_self());
printf(“主:%x\n”,pthread_self());
int x=0;
而(1){
//睡觉(1),或做一些工作,或:
x++;
如果(x%10000000==0)printf(“boo\n”);
}
}

基本上没有,但实际上也没有。只需准确编写您想要的代码即可。你遇到了什么障碍?(如果您需要更多帮助,了解您正在使用的线程库或标准将非常有用。C++11?POSIX?Windows?)基本上我需要硬件中断的功能。我有一个线程从文件中读取数据。然后它应该要求主线程调用一个函数。主线程将执行某些操作。它应该停止执行并开始执行该函数。完成后,主线程应该继续它正在做的事情。我现在正在使用windows库。在我更新了我的问题之后,我将为linux(pthread)做这件事。请看基本上我想要什么硬件中断。我有一个线程从文件中读取数据。然后它应该要求主线程调用一个函数。主线程将执行某些操作。它应该停止执行并开始执行该函数。在完成它之后,主线程应该继续使用queue is选项进行操作,但我要寻找的是像Linux上的硬件doesOn那样的中断,我想试着看看使用它是否有帮助。“` SIGUSR1和SIGUSR2信号被预留给您,供您以任何方式使用。如果在接收信号的程序中为它们编写信号处理程序,它们对于简单的进程间通信非常有用。”