【问题标题】:Understanding OS dispatching between different processors了解不同处理器之间的操作系统调度
【发布时间】:2014-11-25 20:46:04
【问题描述】:

如果我有课

class A{
  A(){
   getcontext(context);
   makecontext(context, fun1, etc)
   put context pointer on queue
   }

  fun1(args){
    something
  }
 }

在我在 CPU1 上运行的 Thread1 中创建了一个类 A 的实例,然后尝试将上下文从队列中弹出并从 CPU2 上的 thread2 中交换,是否会出现问题,因为该对象是在堆栈中实例化的CPU1 中的 Thread1 以及因此被攻击到此上下文的 fun1 的指针无法访问?

【问题讨论】:

    标签: c++ multithreading operating-system pthreads multicore


    【解决方案1】:

    我会说答案是肯定的和否定的。所有线程共享相同的内存。如果超过 1 个线程访问对象,则需要注意线程之间的同步访问。这是肯定的部分。

    没有部分是当你说线程1的堆栈时。堆栈变量是函数的本地变量。如果函数返回,则局部变量不再有效。你没有显示足够的代码让我看到上下文是在哪里创建的,以及在堆栈上分配对象的函数是否等到线程 2 完成。

    【讨论】:

      【解决方案2】:

      没有。线程的全部意义在于它们共享所有内存。

      【讨论】:

      • 嘿,谢谢,所以我实际上是在尝试使用上下文切换来实现线程库。我当时的疑问是我将如何确保他们之间共享内存?在这里说线程 1 和线程 2 可能会误导我。
      • @Achint 你不需要做任何特别的事情。
      • 好的。我想我的困惑是每个上下文都会有一个与之关联的堆栈。在实例化 A(线程)的当前上下文中,该对象将保存在该上下文的堆栈中吗?所以当我将一个函数附加到一个新的上下文时,它基本上是告诉程序计数器从那个函数开始,对吗?哪个是存储在另一个上下文堆栈中的对象的成员?
      • @Achint 是的,基本上就是这样。
      • 但他们不应该访问彼此的堆栈吗?不是说他们不能,而是他们不应该?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多