[返回博客](/cn/blog) # Teigha 多线程底层 API（第 3 部分，共 4 部分）

Andrew Markovich 二月 20, 2018 [\#performance](/cn/blog/tag/performance) [\#Example](/cn/blog/tag/example) [\#getting started](/cn/blog/tag/getting-started)

<a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_linkedin"></a>

本文是关于用于多线程的底层 API 系列文章的一部分。有关之前的文章，请参阅[第 1 部分](https://www.opendesign.com/blog/2018/january/teigha-multithreading-low-level-api-part-1-4)和[第 2 部分](https://www.opendesign.com/blog/2018/february/teigha-multithreading-low-level-api-part-2-4)。

#### 内置 Teigha 线程 ID 访问器

任何操作系统上的每个线程（包括主进程线程）都表示为一个唯一的操作系统原子，因此它具有自己唯一的系统级 ID。线程 ID 的可用性不取决于启动线程和进程的框架的复杂性；这意味着，例如，如果使用 .NET Framework 对象启动线程，该线程也将包含一个唯一的系统级 ID，可以从底层本机代码访问。

线程计数器使用线程 ID 与外部线程通信。

从任何当前运行 Teigha 代码的线程中，您可以使用 Teigha 跨平台 odGetCurrentThreadId 函数访问当前线程 ID：

```
FIRSTDLL_EXPORT unsigned          odGetCurrentThreadId();

```

此 ID 可用于在 Teigha 线程计数器对象中识别线程。

#### 使用 odGetCurrentThreadId() 函数的示例

我们将扩展我们在[第 2 部分](https://www.opendesign.com/blog/2018/february/teigha-multithreading-low-level-api-part-2-4)中关于互斥对象的控制台输出。扩展 ProcessImageCaller::entryPoint 方法中的输出字符串，以输出当前线程 ID 以及已处理的扫描行信息：

```
pCaller->m_pOutput->addString(OdString().format(OD_T("Thread %u processed scanlines from %u to %u\n"),<br></br>
::odGetCurrentThreadId(), (unsigned)pCaller->m_scanLineFrom, <br></br>
(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 的最后一篇文章。

## 今天就开始行动

**免费试用 ODA 软件 60 天。  
无风险，无需信用卡。**

[免费试用](https://www.opendesign.com/cn/free-trial)
