【问题标题】:GetProcessID vs GetThreadIDGetProcessID 与 GetThreadID
【发布时间】:2015-08-20 16:24:10
【问题描述】:

当我执行以下代码时-:

#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
    cout << GetCurrentProcessId() << endl;
    cout << GetCurrentThreadId() << endl;
}

我得到以下输出-:

1160
4316

我的问题是-:

  • 既然这是一个独立的进程,它怎么会有一个“thread-id”呢?
  • 为什么输出中的两个整数不同?

我在 Windows 7 上使用 C++14 和 TDM-GCC 4.9.1 编译器。

【问题讨论】:

    标签: c++ windows multithreading gcc


    【解决方案1】:

    由于您使用的是 Windows,因此 MSDN 不得不说:

    Processes and Threads

    一个应用程序由一个或多个进程组成。用最简单的术语来说,一个进程就是一个正在执行的程序。一个或多个线程在进程的上下文中运行。线程是操作系统分配处理器时间的基本单位。线程可以执行进程代码的任何部分,包括当前正在由另一个线程执行的部分。

    About Processes and Threads

    每个进程都提供执行程序所需的资源。进程具有虚拟地址空间、可执行代码、系统对象的打开句柄、安全上下文、唯一进程标识符、环境变量、优先级类、最小和最大工作集大小,以及至少一个执行线程。 每个进程都由一个线程启动,通常称为主线程,但可以从它的任何线程创建额外的线程。

    线程是进程中可以安排执行的实体。一个进程的所有线程共享它的虚拟地址空间和系统资源。此外,每个线程都维护异常处理程序、调度优先级、线程本地存储、唯一的线程标识符,以及系统将用于保存线程上下文直到被调度的一组结构。线程上下文包括线程的机器寄存器集、内核堆栈、线程环境块和线程进程地址空间中的用户堆栈。线程也可以有自己的安全上下文,可用于模拟客户端。

    【讨论】:

      【解决方案2】:

      对于 Windows,每个进程至少有一个线程,并且可以有多个线程。 Windows 对进程和线程使用不同的 id。

      【讨论】:

      • 为什么每个进程至少有一个线程?该线程的目的是什么?
      • @AnmolSinghJaggi 因为这就是 Windows 的设计方式。每个进程都有一个主线程。
      • 如果一个进程没有线程,它会用什么来做任何事情?一个进程实际上更像是一组独特的线程到一个公共地址空间。你至少需要一个线程来做任何事情。
      • @RyanP 有道理。谢谢!
      猜你喜欢
      • 2023-03-24
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      相关资源
      最近更新 更多