本文是关于用于多线程的底层 API 系列文章的一部分。有关之前的文章,请参阅第 1 部分和第 2 部分。
内置 Teigha 线程 ID 访问器
任何操作系统上的每个线程(包括主进程线程)都表示为一个唯一的操作系统原子,因此它具有自己唯一的系统级 ID。线程 ID 的可用性不取决于启动线程和进程的框架的复杂性;这意味着,例如,如果使用 .NET Framework 对象启动线程,该线程也将包含一个唯一的系统级 ID,可以从底层本机代码访问。
线程计数器使用线程 ID 与外部线程通信。
从任何当前运行 Teigha 代码的线程中,您可以使用 Teigha 跨平台 odGetCurrentThreadId 函数访问当前线程 ID:
FIRSTDLL_EXPORT unsigned odGetCurrentThreadId();
此 ID 可用于在 Teigha 线程计数器对象中识别线程。
使用 odGetCurrentThreadId() 函数的示例
我们将扩展我们在第 2 部分中关于互斥对象的控制台输出。扩展 ProcessImageCaller::entryPoint 方法中的输出字符串,以输出当前线程 ID 以及已处理的扫描行信息:
pCaller->m_pOutput->addString(OdString().format(OD_T("Thread %u processed scanlines from %u to %u\n"),
::odGetCurrentThreadId(), (unsigned)pCaller->m_scanLineFrom,
(unsigned)(pCaller->m_scanLineFrom + pCaller->m_nScanLines - 1)));
现在,我们示例应用程序的控制台输出将如下所示:
4 个文件在 0.413389 秒内加载并渲染
线程 8240 处理了从 0 到 255 的扫描行
线程 7508 处理了从 256 到 511 的扫描行
线程 8776 处理了从 768 到 1023 的扫描行
线程 10040 处理了从 512 到 767 的扫描行
最终光栅图像在 0.543844 秒内处理完成
请关注本系列关于原子操作和使用多线程底层 API 的最后一篇文章。