我正在尝试从 POSIX 中的 ExpressLogic 移植实时 Thread_Metric,以便为我的论文对 Linux、Xenomai 和 RTAI 的 PREEMPT_RT 补丁进行基准测试。他们提供了一个具有以下函数的 C 源文件,您必须实现这些函数才能使基准测试正常工作:
void tm_initialize(void (*test_initialization_function)(void));
int tm_thread_create(int thread_id, int priority, void (*entry_function)(void));
int tm_thread_resume(int thread_id);
int tm_thread_suspend(int thread_id);
void tm_thread_relinquish(void);
void tm_thread_sleep(int seconds);
int tm_queue_create(int queue_id);
int tm_queue_send(int queue_id, unsigned long *message_ptr);
int tm_queue_receive(int queue_id, unsigned long *message_ptr);
int tm_semaphore_create(int semaphore_id);
int tm_semaphore_get(int semaphore_id);
int tm_semaphore_put(int semaphore_id);
int tm_memory_pool_create(int pool_id);
int tm_memory_pool_allocate(int pool_id, unsigned char **memory_ptr);
int tm_memory_pool_deallocate(int pool_id, unsigned char *memory_ptr);
现在我正在尝试实现 tm_thread_suspend 和 tm_thread_resume 函数,它们将 pthread 作为输入。我知道您可以使用 pthread_mutex_lock 和 pthread_cond_wait 例程挂起 pthread,但您必须从线程 start_function 调用这些例程。我对这类事情很陌生,而且我已经无法理解了。任何帮助表示赞赏。
pthread_suspend
如果可行的话,这似乎确实是可行的方法。这个解决方案可能比它的价值更脏。为每个线程保留一个semaphore
。让每个线程监听信号。在信号处理程序中只需执行down
在相关的信号量上。
所以当你想要stop
一个线程,只需向它发送一个信号(也许使用实时信号是最好的),它就会在处理程序中停止。默认情况下,处理程序会屏蔽自身(也就是说,如果在完成之前收到相同的信号,则不会再次调用它)。当你想重新启动线程时,只需执行up
在信号量上。
Caveat:
- 使用 @bmargulies 的建议,如果可以的话会更好(更安全、更清洁、更高效)
- 您还可以使用互斥体代替信号量
- Dealing with signals is a nasty job. Before embarking make sure you (re)read about
- 异步信号安全
- 线程和信号
- 中断和重新启动系统调用(
SA_RESTART
)
- 我很确定sem_wait(3) http://linux.die.net/man/3/sem_wait异步信号不安全,但只要您安全,它就是安全的不要使用
SA_NODEFER
(并不是说你有任何理由)
不幸的是,我找不到任何关于此的真正出色的免费文档。尽管如此,无论是否优秀,还是有很多免费文档。
Edit
正如@R..建议的那样async-signal-safe
阻止您可以使用的函数(而不是不安全的sem_wait
)。这是您可以安全使用的功能列表 http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_04.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)