1

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

...
critical section
...

pthread_setschedparam(thread_id, oldpolicy, &oldparams);

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

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

4

2 回答 2

4

那不会同步任何东西!

这样做是为了防止线程在临界区运行时被调度到 CPU 之外。由于我们现在有多个 CPU,并且由于不同的线程可以在另一个 CPU 上运行,所以它根本不排除任何东西。它甚至不能完全阻止抢占;如果等待页面错误或其他 IO,线程仍然可以休眠。

这样做的原因是为了避免在计算非常重要的东西时让其他线程挨饿,否则其他线程就无法继续。它确实有助于解决这个问题,但这是一个非常特殊的案例(搜索“优先级反转”)。

于 2013-09-30T11:19:01.893 回答
3

如果您有多个内核,则它会损坏,除非您将所有可能与同一内核冲突的线程锁定。而且,即使那样,如果您阻塞 I/O,它仍然会损坏。(例如,页面错误。)糟糕。

于 2013-09-30T11:18:25.187 回答