我知道有一些C ++的线程库,比如Pthread,Boost等,但它们是如何工作的?必须在某处实现逻辑。
让我们说我想在C ++中编写自己的线程机制,而不是使用任何库,我该如何开始?写这篇文章时我应该记住什么?
答案 0 :(得分:6)
您将直接在操作系统中调用基础API调用。例如,CreateThread。当然,这是繁琐且特定于平台的,这就是我们喜欢使用可移植C ++线程库的原因......
答案 1 :(得分:3)
在C ++ 98/03中,没有“线程”的概念,因此无法在语言中回答问题。在C ++ 11中,答案是使用<thread>
。
在实现方面,线程是一种操作系统功能。操作系统已经必须安排多个进程(即单独的程序),并且多线程操作系统增加了在一个进程内调度多个线程的能力。最重要的是,操作系统可能会或可能不会利用物理上不止一个CPU(虽然这也适用于简单的多处理;相反,您可以在单个CPU上安排多个线程)。编程的核心是,您需要硬件支持同步原语,如原子读/写和原子比较和交换,以实现正确的内存访问。 (这只是不只需要多处理,因为单独的进程具有不同的内存;尽管操作系统本身需要 是使用多个物理CPU。)
答案 2 :(得分:1)
你不能编写自己的线程机制,除非你的意思是像协同例程这样的伪线程而不是实际的并发执行线程。这是因为基本线程机制是由内核定义的,您不能更改它也不能实现自己的。您编写的任何库最终都必须退回到操作系统。
答案 3 :(得分:1)
好吧,你需要能够运行多个线程的东西。
如果您正在开发裸机上的操作系统内核,我认为当前的多核处理器在上电复位后只有一个核心工作。即使是大多数PC上的BIOS也可能只保留一个核心(其他核心空闲)。因此,您需要编写(汇编,非可移植)代码来启动其他内核。
并且(正如詹姆斯提醒你的那样),大部分时间你都在使用某些操作系统内核。例如,在Linux上(我不知道Windows),内核知道线程(因为它调度的任务是线程),它们需要由Linux clone(2)
system call启动。
通常,内核线程很重,系统有一个库(NPTL用于Linux Posix线程),它可能比用户线程使用更少的内核线程(实际上Linux NPTL是内核和内核之间的1:1映射)用户线程,但在其他一些系统上,比如Solaris,可能会有所不同。)