我找到了另一种从strongswan的源代码同步线程的方法。它通过更改线程的计划策略(SCHED_FIFO
)来同步线程。它比mutex
方式有什么优势吗?
int oldpolicy;
struct sched_param oldparams, params;
pthread_getschedparam(thread_id, &oldpolicy, &oldparams);
params.__sched_priority = sched_get_priority_max(SCHED_FIFO);
pthread_setschedparam(thread_id, SCHED_FIFO, ¶ms);
...
critical section
...
pthread_setschedparam(thread_id, oldpolicy, &oldparams);
PS: strongswan使用malloc hook来检测内存泄漏。为了支持多线程,它使用这种方式来同步线程。
PPS:似乎他们修改了代码。来自Strongswan 4.5.0版本的那段代码。
答案 0 :(得分:4)
这不会同步任何事情!
这样做可以防止在关键部分运行时从线程调度线程。由于我们现在有多个CPU,并且由于不同的线程可以在另一个CPU上运行,因此它根本不排除任何内容。它甚至不能完全阻止先发制人;如果等待页面错误或其他IO,线程仍然可以休眠。
它的原因是为了避免在计算非常重要的东西时使其他线程匮乏,否则其他线程无法继续。它确实有帮助,但这是一个非常专业的案例(搜索“优先级倒置”)。
答案 1 :(得分:3)
如果你有多个核心,它会被破坏,除非你锁定可能与同一核心冲突的所有线程。即便如此,如果阻止I / O,它仍然会被破坏。 (例如,页面错误。)Yuck。