linux - 在没有内核支持的情况下唤醒一个线程

标签 linux multithreading ipc

有没有什么机制可以不经过内核就可以唤醒另一个进程中的线程?等待线程可能会在一个循环中旋转,没问题(每个线程都与一个单独的核心 Hook ),但在我的情况下,发送线程必须很快,并且不能通过内核来唤醒等待线程.

最佳答案

否,如果另一个线程正在休眠(不在 CPU 上)。要唤醒此类线程,您需要通过调用作为内核一部分的调度程序将其状态更改为“RUNNING”。

是的,如果两个线程或进程运行在不同的 CPU 上,并且它们之间存在共享内存,则可以同步两个线程或进程。您应该将所有线程绑定(bind)到不同的 CPU。然后你可以使用自旋锁:pthread_spin_lockpthread_spin_unlock来自 POSIX 的 Pthread 可选部分的函数 ('(ADVANCED REALTIME THREADS)'; [THR SPI]);或任何自定义自旋锁。自定义自旋锁很可能会使用一些原子操作和/或内存屏障。

发送线程会改变内存中的值,由接收线程循环检查。

例如

初始化:

pthread_spinlock_t lock;
pthread_spin_lock(&lock);  // close the "mutex"

然后启动线程。

等待线程:

{
pthread_spin_lock(&lock); // wait for event;
work();
}

主线程:

{
do_smth();
pthread_spin_unlock(&lock); // open the mutex; other thread will see this change
 //  in ~150 CPU ticks (checked on Pentium4 and Intel Core2 single socket systems);
 // time of the operation itself is of the same order; didn't measure it.
continue_work();
}

关于linux - 在没有内核支持的情况下唤醒一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7236693/

相关文章:

c - 修改内存映射文件时通知/发出信号

c - 在 c 中的消息队列上进行类型转换

无法在 GNU/Linux 中读取二进制视频文件

linux - 我可以在调试器中跟踪控制流吗?

java - Android应用程序和套接字

java - 我如何使用同步原语来帮助 Waiters 服务 java 中的表?

linux - Windows 上的 GUI 在联网的 Linux 机器上运行 Linux 脚本?

linux - `gcc: error: 0": No such file or directory` error? 是什么性质

c++ - 将多个参数传递到 std::thread

unix 管道多个编写器