线程

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个并行任务,线程池就会自动增加。





Copyright © 2010 Aldebaran-Robotics - 版权所有