![]() |
1
4
在单个时间片中执行该操作毫无帮助-该操作可以在另一个内核或处理器上并行执行,并在执行交换时访问流。当流处于不一致状态时,必须使用锁定来防止所有人访问流。 |
![]() |
2
1
数据接收线程需要锁定访问处理程序指针,并且需要锁定更改处理程序指针。 或者,如果处理程序是单个变量,则可以使用interlocked.exchange()自动交换值。 |
![]() |
3
0
为什么不从另一个方向着手,让有问题的线程处理交换呢?据推测,当有数据需要处理时,某些东西会被唤醒,并将其传递给当前的foo。你能给那个线程发一个通知吗,它下次唤醒时需要换一个新的处理程序?我想,这样就不用担心了。 |
![]() |
4
0
好的-回答你的具体问题。 您可以枚举进程中的所有线程,并对每个线程(活动线程除外)调用thread.suspend(),进行更改,然后调用thread.resume()。 |
![]() |
5
0
假设您的处理程序是线程安全的,我的建议是在处理程序上编写一个公共包装器,使用一个私有锁来完成它需要的所有锁定,这样您就可以安全地在后台更改处理程序。 如果你这样做,你也可以使用 ReaderWriterLockSlim ,用于访问允许并发读取访问的打包处理程序。 或者,您可以以一种不需要锁定的方式构建包装类和处理程序类,并且可以使用简单的互锁写或比较交换来完成处理程序淹没。 示例如下:
请注意,如果需要对处理程序的方法执行原子操作,这仍然不是线程安全的,那么您需要在线程之间使用更高级别的锁定,或者在包装类上添加方法,以支持线程安全的原子操作(例如,EndTreadSafeBlock()使用的BeginReadSafeBlock(),它为为一系列操作编写。 |
![]() |
6
0
你不能,这是合乎逻辑的,你不能。你能做的最好的就是避免任何其他线程破坏这两个操作之间的状态(正如已经说过的)。 这就是为什么你不能: 假设有一个块告诉操作系统当您在该块上时不要线程切换。这在技术上是可能的,但会导致世界各地的饥饿。 你可能认为你的线程是唯一被使用的,但这是一个不明智的假设。这里有垃圾收集器,这里有与线程池线程一起工作的异步操作,一个外部引用,比如一个COM对象可以跨越它自己的线程(在内存空间中),这样当你在那里的时候就不会有人进步。 假设您在HookOperation方法中执行了非常长的操作。它涉及许多非泄漏操作,但是由于垃圾收集器无法接管以释放资源,因此最终您将失去任何内存。或者设想您调用一个使用多线程处理请求的COM对象…但它不能启动新的线程(它可以启动它们,但它们永远无法运行),然后加入它们,等待它们完成后再返回…因此,你加入自己,永不回来!! |
![]() |
7
0
正如其他海报已经说过的,您不能从用户模式代码强制执行系统范围的关键部分。但是,您不需要它来实现热交换。 这是怎么做的。
使用与热插拔相同的接口实现代理
|
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |
![]() |
user1700890 · 了解交互式代理Python API中的线程 2 年前 |
![]() |
AntonBoarf · 为什么要将实例变量指定给局部变量? 2 年前 |
![]() |
rhymes · 如何让线程操作相同的java列表 3 年前 |