【问题标题】:how to save a thread stack before it exits?如何在退出之前保存线程堆栈?
【发布时间】:2015-10-23 06:26:09
【问题描述】:

我正在处理一个多线程项目,我需要在代码中的某个位置复制一个线程的堆栈(我需要一个指向它的指针)。因为在这个线程退出后我将需要那个指针(并且它的堆栈被释放)。 如果我能以某种方式告诉pthread_exit() 不要释放线程堆栈,它也可以完成这项工作!

PS:这背后的原因是我想稍后在这个线程实际上已经死的时候使用setcontext(ucontext_t*)

【问题讨论】:

  • 我认为您遇到了 XY 问题。你想用它来达到什么目的?
  • @FUZxxl:我想隐藏一个等待线程,这样操作系统就不会看到它,(它用于一些调度测试)。我以为我会杀死它,然后当我想唤醒它时,我会恢复它。我的项目非常有必要隐藏线程。
  • 如果您的项目确实需要这样做,那么解决此问题的方法是编写您自己的操作系统,或者至少编写线程库。
  • 请注意,线程不仅仅包含堆栈——还有线程本地存储和各种其他属性。您不能仅通过保留其堆栈来保留线程。
  • 为什么不让线程锁定pthread_mutex_t

标签: c linux multithreading stack pthread-exit


【解决方案1】:

正如评论者所说,保存线程堆栈以便以后恢复它会非常困难。如果您需要阻止线程被调用,您可以尝试用锁“暂停”它。查看示例here

【讨论】:

  • 不幸的是,锁正是我不想要的(我不相信它),因为有了锁,就无法确保操作系统没有安排我的线程,我需要证明某事。
  • 好吧,我很确定,对于功能正常的操作系统,卡在信号量上的线程根本不会获得任何 CPU 周期。
【解决方案2】:

如前所述,这可能是 XY 问题的情况。但是,解决方案是在每个线程中使用pthread_mutex_t

创建线程的函数将创建pthread_mutext_t 并将其传递给线程。

pthread_t tid;
pthread_mutext_t mutex;

pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);

pthread_create(&tid, NULL, fun, &mutex);

// do stuff

pthread_mutex_unlock(&mutex);

线程函数如下...

void fun(void* arg) {

  pthread_mutex_t* mutex = (pthread_mutex_t*) arg;
  pthread_mutex_lock(mutex);

  // do stuff
}

如果您需要异步执行此操作,您可以为SIGUSR1SIGUSR2 注册一个信号处理程序,并使用pause 取消调度线程。

signal(SIGUSR1, on_usr1);
signal(SIGUSR2, on_usr2);

void on_usr1(int sig) {

  pause();
}

void on_usr2(int sig) {
}

然后使用pthread_kill 将信号提升到线程...

pthread_kill(tid, SIGUSR1);

【讨论】:

  • pthread_lock 无法解决我的问题,因为我需要确保操作系统没有安排我的线程。但我不知道暂停。谢谢你。
  • @zmeftah 为什么需要确保操作系统根本不调度线程?
  • 因为那时我将使用基准程序并获得一些结果并进行一些比较......类似的东西。我正在测试的情况是操作系统根本不应该安排它。
  • @zmeftah 我认为这可能是 XY 的另一个例子。基准是什么?您在基准测试中使用的量级是多少?
  • 这是来自普林斯顿的parsec 基准测试,我的工作不是让操作系统调度线程,无论如何我可以。首先,我试图实现自己的 ULT 库,但多处理成本很高,实际上并没有用。然后我决定使用 pthreads 并以某种方式阻止操作系统对其进行调度。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多