首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想问一下CreateThread和基于Linux操作系统的pthread_create之间的主要区别

我想问一下CreateThread和基于Linux操作系统的pthread_create之间的主要区别
EN

Stack Overflow用户
提问于 2021-02-02 08:49:26
回答 1查看 450关注 0票数 1

我想用C/C++实现一个运行在Windows和Linux操作系统上的应用程序,这个应用程序将是多线程的,所以经过一些研究,我发现Windows和Linux分别有各自的库方法。

代码语言:javascript
复制
HANDLE CreateThread( // Windows
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);
代码语言:javascript
复制
// Linux
int pthread_create( pthread_t* thread,
                    const pthread_attr_t* attr,
                    void* (*start_routine)(void* ),
                    void* arg );

根据微软的文档的说法,CreateThread似乎使用了一个虚拟地址来执行线程,据我理解,这个线程是一个“用户级”线程。

另一方面,从pthread_create的回答到类似的问题这里

例如,Linux系统中的每一个进程都是一个“内核线程”,而每个用户创建的线程也被实现为一个新的内核线程。

因此,我认为pthread_create确实创建了一个基于内核的线程。

通过比较用户级线程和内核级线程,我在补习点中遇到了一篇关于这个主题的文章/教程。

(这张图片来自该页面。)

这意味着来自同一进程的用户级线程很可能共享内核级线程。(这不是多线程而是并行执行?)

由于我希望我的应用程序在两个平台上具有相同的行为(性能或执行方面),所以有两个问题我想问:

  1. CreateThread创建的线程是否将1:1映射到内核线程?(这意味着应用程序可以利用多核处理。)
  2. 如果问题(1)的答案是错误的,那么是否有任何方法等同于或模拟Windows中pthread_create的行为?(有PsCreateSystemThread for Windows,但我不确定它创建的线程是否具有与来自pthread_create的线程类似的甚至更高的操作权限)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-02 09:36:40

您在这里非常容易混淆两件事:用户级线程和内核级线程是一回事。这意味着,对于用户级线程,内核无法独立地调度它们,因为它不知道它们;而对于内核级线程,内核可以独立地调度每个线程,即决定在不同的内核上同时运行它们,或者独立地唤醒它们。

AFAIK,pthread不指定要使用的任何一个模型。但是在当前的Linux实现中,NPTL即本地POSIX线程库使用内核级线程(或者有一对一的内核线程到用户线程的映射)。

线程是否共享相同的虚拟地址空间是完全不同的--如果它们共享相同的地址空间,那么每个线程都可以看到其他线程提交的内存修改。如果他们不共享地址空间,那么他们就不会看到其他执行线程所做的修改。在Linux术语中,一个单独的虚拟地址空间称为进程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66006307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档