我想用C/C++实现一个运行在Windows和Linux操作系统上的应用程序,这个应用程序将是多线程的,所以经过一些研究,我发现Windows和Linux分别有各自的库方法。
HANDLE CreateThread( // Windows
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
__drv_aliasesMem LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);// Linux
int pthread_create( pthread_t* thread,
const pthread_attr_t* attr,
void* (*start_routine)(void* ),
void* arg );根据微软的文档的说法,CreateThread似乎使用了一个虚拟地址来执行线程,据我理解,这个线程是一个“用户级”线程。
另一方面,从pthread_create的回答到类似的问题这里,
例如,Linux系统中的每一个进程都是一个“内核线程”,而每个用户创建的线程也被实现为一个新的内核线程。
因此,我认为pthread_create确实创建了一个基于内核的线程。
通过比较用户级线程和内核级线程,我在补习点中遇到了一篇关于这个主题的文章/教程。

(这张图片来自该页面。)
这意味着来自同一进程的用户级线程很可能共享内核级线程。(这不是多线程而是并行执行?)
由于我希望我的应用程序在两个平台上具有相同的行为(性能或执行方面),所以有两个问题我想问:
CreateThread创建的线程是否将1:1映射到内核线程?(这意味着应用程序可以利用多核处理。)pthread_create的行为?(有PsCreateSystemThread for Windows,但我不确定它创建的线程是否具有与来自pthread_create的线程类似的甚至更高的操作权限)发布于 2021-02-02 09:36:40
您在这里非常容易混淆两件事:用户级线程和内核级线程是一回事。这意味着,对于用户级线程,内核无法独立地调度它们,因为它不知道它们;而对于内核级线程,内核可以独立地调度每个线程,即决定在不同的内核上同时运行它们,或者独立地唤醒它们。
AFAIK,pthread不指定要使用的任何一个模型。但是在当前的Linux实现中,NPTL即本地POSIX线程库使用内核级线程(或者有一对一的内核线程到用户线程的映射)。
线程是否共享相同的虚拟地址空间是完全不同的--如果它们共享相同的地址空间,那么每个线程都可以看到其他线程提交的内存修改。如果他们不共享地址空间,那么他们就不会看到其他执行线程所做的修改。在Linux术语中,一个单独的虚拟地址空间称为进程。
https://stackoverflow.com/questions/66006307
复制相似问题