通过更改计划优先级来同步线程

时间:2013-09-30 11:14:52

标签: c linux multithreading

我找到了另一种从strongswan的源代码同步线程的方法。它通过更改线程的计划策略(SCHED_FIFO)来同步线程。它比mutex方式有什么优势吗?

The code

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, &params);

...
critical section
...

pthread_setschedparam(thread_id, oldpolicy, &oldparams);

PS: strongswan使用malloc hook来检测内存泄漏。为了支持多线程,它使用这种方式来同步线程。

PPS:似乎他们修改了代码。来自Strongswan 4.5.0版本的那段代码。

2 个答案:

答案 0 :(得分:4)

这不会同步任何事情!

这样做可以防止在关键部分运行时从线程调度线程。由于我们现在有多个CPU,并且由于不同的线程可以在另一个CPU上运行,因此它根本不排除任何内容。它甚至不能完全阻止先发制人;如果等待页面错误或其他IO,线程仍然可以休眠。

它的原因是为了避免在计算非常重要的东西时使其他线程匮乏,否则其他线程无法继续。它确实有帮助,但这是一个非常专业的案例(搜索“优先级倒置”)。

答案 1 :(得分:3)

如果你有多个核心,它会被破坏,除非你锁定可能与同一核心冲突的所有线程。即便如此,如果阻止I / O,它仍然会被破坏。 (例如,页面错误。)Yuck。