线程
NAOqi和NAOqi模块是线程安全(Thread safe)的。而所有使用模块生成器创建的模块都是线程不安全。用户函数可被并行调用,但是它们必须是线程安全。可以使用临界区来保护自己的函数。
Aldebaran公司向您提供保护函数的工具。手动锁定/解锁互斥可能会非常危险,因为有时我们会忘记解锁互斥,或是由于引发异常而无法解锁。
如何使函数线程安全
类 | 说明 |
---|---|
ALCriticalSection( pthread_rwlock_t * pMutex ) | 只要ALCriticalSection对象存在,该块即为线程安全。如果引发了异常,互斥会被自动解锁。 |
ALCriticalSectionRead( pthread_rwlock_t * pMutex ), ALCriticalSectionWrite( pthread_rwlock_t * pMutex ) | 同ALCriticalSection,而只要没有人写入,您可以随意拥有若干阅读器。 |
ALCriticalFalseIfLocked(pthread_mutex_t *mutex, bool &alreadyLocked); | 如果互斥已经被锁定,就将不会被锁定,但是参数alreadyLocked会变为“true”。 |
ALCriticalSection(ALPtr<ALMutex> mutex) | ALMutex管理Pthread互斥的初始化和销毁。 |
ALPtr<ALMutex> createALMutex() | ALMutex构造函数是私有的,请使用静态createALMutex。 |
注意: | Pthread互斥必须重置和销毁,但所有临界区构造函数也接受会自动被重置和销毁的ALMutex。 |
---|
//C++ sample void myCallBack() { ALCriticalSection section(mutex); // All following code is thread safe // ... return; // end of critical section here }
// C++ // other function that use same mutex void myCallBack2() { ALCriticalSectionFalseIfLocked section(mutex, val); if (val) { // mutex is alread locked, i don't want to execute the method return; } // All following code is thread safe // ... return; // end of critical section here }
只有DCM在NAOqi里有一个实时线程。
scheduling policy: SCHED_FIFO scheduling priority: 90
其它来自线程池的线程都按照以下选项创建,以将优先权赋予DCM:
pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED) pthread_attr_setschedpolicy(&attr, SCHED_OTHER)
在默认情况下,线程池有20个线程,栈大小为1310720个字节。“post.call”会执行来自线程池里已有线程的函数。如果运行了超过20个并行任务,线程池就会自动增加。