当前位置: 首页 > 面试题库 >

runtime.LockOSThread是否允许子goroutine在同一OS线程中运行?

卢志强
2023-03-14
问题内容

我知道在Go中,runtime.LockOSThread()会将goroutine绑定到一个OS线程,并且不允许其他goroutine在该线程中执行。儿童goroutine也是这样吗?

例如:

runtime.LockOSThread()
go func() {
    go func() {
        // Do something
    }()
    // Do something
}()

这两个goroutine是在单个和排他的OS线程中执行还是仅在第一个线程中执行?


问题答案:

文档的runtime.LockOSThread说:

LockOSThread 调用goroutine连接
到其当前的操作系统线程。在调用goroutine退出或调用UnlockOSThread之前,它将始终在该线程中执行,
并且其他goroutine不能执行

(强调我的)

这意味着,如果Go的某个实现实现了您的要求,那将是错误的。

需要说明的是:goroutine是否保留了一个线程,而另一个goroutine在同一线程上执行了;那是错的。



 类似资料:
  • #include <stdio.h> #include <pthread.h> int a = 0; int b = 0; void *thread1_func(void *p_arg) { while (1) { a++; sleep(1); } } void *thread2_fu

  • 方法有一个有趣的属性,它将允许其他线程在被阻止时进入其同步块。例如(假设线程1首先运行): 线程1: 线程2: 线程 2 能够唤醒线程 1 的事实意味着线程 2 进入了同步块,即使其他某个线程位于同一对象的同步块中也是如此。这对我来说很好,但我想知道这是否只发生在或所有会使线程“等待”的方法()上。在我的情况下,我关心,因为如果行为与相同,它会破坏我的代码: 那么,多个线程是否可能因为join调用

  • 喷雾布线基于Akka actor系统。在我记得的所有示例代码中,路由都是“快速”完成的,并且将实际工作派生给其他参与者,除非需要同步完成以获得响应。 换句话说,喷雾路由多线程模型到底是什么? 我可以将验证生成给另一个参与者,但在这种情况下,REST API响应将不再能够报告传入内容是否存在错误。处理这件事的最佳方法是什么?

  • 问题内容: 是否有任何原因为什么或为什么不应该在子查询中执行“排序依据”? 问题答案: 是:不应这样做,因为从概念上讲这没有意义。 子查询将在某些外部查询中使用(否则它将毫无意义),并且该外部查询无论如何都必须进行排序,因此对子查询进行排序没有任何意义。 这是因为除非使用显式ORDER,否则SQL中的查询结果将没有特定的顺序。因此,即使您在子查询中使用了ORDER,也无法保证这会影响外部查询的结果

  • 问题内容: 上面的代码创建了100个goroutine,将num插入到通道c,所以我只是想知道,这些goroutine是否会以随机顺序执行?在我的测试期间,输出将始终为1到100 问题答案: 严格来说,您观察到的“随机”行为是不确定性行为。 要了解此处发生的情况,请考虑通道的行为。在这种情况下,它有许多goroutine试图写入通道,而只有一个goroutine从通道中读出。 阅读过程只是顺序的,

  • 问题内容: 我在同一文件中有以下程序。我已经同步了run()方法。 输出是 我的问题是,为什么同步方法同时允许“我的线程1”和“我的线程4”线程访问? 问题答案: 方法在实例级别工作。 类的每个实例都有自己的锁。每次输入实例的任何方法都将获取该锁。这样可以防止多个线程 在同一个实例上 调用方法(请注意,这还可以防止在同一个实例上调用 不同的 方法)。 现在,由于您有两个类实例,因此每个实例都有自己