在本章节中:

前提条件

要启用测试多线程应用程序的功能,请在【构建】设置的【编译器】选项(如 设置项目和文件选项中所述)中添加以下选项:

"-DCPPTEST_THREADS=1"

此选项将激活 C++test 的运行时库中的多线程支持,并禁用对线程相关例程使用安全桩函数

注意事项

  • C++test 的测试可执行文件必须与适当的运行时库链接(即,用于 Visual C++ 编译器的 C 运行时库的多线程版本或 UNIX 上的 pthread 库)。
  • C++test 的运行时不控制线程的生存时间 - 我们建议您实施测试用例,以便在测试用例完成时终止所有线程。

已知的问题和限制

已知的问题和限制:

  • 如果启用了多线程支持(使用 -DCPPTEST_THREADS=1),但是在链接期间没有使用适当的库(或者一个多线程和单线程的 C Runtime 混合使用),那么测试可执行文件可能会产生损坏的测试结果,或者可能会意外终止。
  • 非主线程中的意外行为(信号、未处理异常、超时)将导致测试可执行文件终止。

构建 C++test 运行时库

C++test 默认的运行时库具有对测试多线程应用程序的内置支持。除非您要构建具有多线程支持的自定义运行时库(例如,用于嵌入式测试),否则无需执行其他操作。如果您需要使用多线程支持来构建自定义运行时库,请将 "- DCPPTEST_THREADS_ENABLED=1" 添加到编译器命令行。

支持的线程 API

运行时库的实现可以使用以下类型的线程 API:

  • Windows 线程
  • POSIX 线程
  • VxWorks 6.x

使用其他线程 API

如果需要使用其他线程 API(或自定义的 API),则必须实现以下类型和例程。

注意,C++test 运行时源中的 CppTestThread.c 文件包含线程支持例程的定义;它可以用作示例或更改的基础。

TIs - 线程本地存储

typedef IMPLEMENTATION_DEPENDENT_TYPE CppTestThreadKey;
/**
* Creates key for thread local storage data * Returns 0 on success
*/
extern int localThreadKeyCreate(CppTestThreadKey* key);
/**
* Deletes key for thread local storage data * Returns 0 on success
*/
extern int localThreadKeyDelete(CppTestThreadKey key);
/**
* Returns a thread specific value associate with a key */
extern void* localThreadGetSpecific(CppTestThreadKey key);
/**
* Associate a thread specific value with a key * Returns 0 on success
*/
extern int localThreadSetSpecific(CppTestThreadKey key, void* value);

Mutex

注意:C++test 运行时假设互斥对象可以静态初始化。

typedef IMPLEMENTATION_DEPENDENT_TYPE CppTestThreadMutex;
#define CPPTEST_THREADS_MUTEX_STATIC_INIT <IMPLEMENTATION_DEPENDENT_STATIC_INITIALIZER>
/**
* Initializes mutex
 * @return 0 on success
 */
extern int localThreadMutexInit(CppTestThreadMutex* mutex);
/**
* Destroy and release resources used by mutex * @return 0 on success
*/
extern int localThreadMutexDestroy(CppTestThreadMutex* mutex);
/**
* Lock mutext and return when calling thread becames is owner of it. * @return 0 on success
*/
extern int localThreadMutexLock(CppTestThreadMutex* mutex);
/**
 * Releases mutex owned by calling thread.
 * @return 0 on success
 */
extern int localThreadMutexUnlock(CppTestThreadMutex* mutex);

Miscellaneous

/**
 * Exits calling thread
 * (never returns)
 */
extern void localThreadExit();
/**
* @return non-zero if threads already finished execution */
extern int localThreadFinished(CppTestThread* thread);
/**
* @return non-zero if threads are supported in current build 
* (proper macros, libraries, compiler options were used).
*/
extern int localThreadsSupported(void);
/**
 * Initializes given thread structure
 */
extern void localThreadInit(CppTestThread* thread);
  • No labels