C++ 什么是线

C++ 什么是线,c++,objective-c,multithreading,C++,Objective C,Multithreading,我一直在网上看什么是一个线程,我觉得我不明白它。有人能解释一下吗?在C++相关的编程语言方面,Objto-C会很好。 在objective-c中,我遇到了 @property(nonatomic, strong) NSString *name; 对非原子的解释是,它意味着不必担心多个线程试图同时访问对象,objective-c也不必合成线程安全的代码。那么,这到底意味着什么呢?一个进程可以由多个执行线程组成,从逻辑上讲,这些线程可以被认为是同时并行运行的。每个线程独立运行,但共享相同的内存和进

我一直在网上看什么是一个线程,我觉得我不明白它。有人能解释一下吗?在C++相关的编程语言方面,Objto-C会很好。 在objective-c中,我遇到了

@property(nonatomic, strong) NSString *name;

对非原子的解释是,它意味着不必担心多个线程试图同时访问对象,objective-c也不必合成线程安全的代码。那么,这到底意味着什么呢?

一个进程可以由多个执行线程组成,从逻辑上讲,这些线程可以被认为是同时并行运行的。每个线程独立运行,但共享相同的内存和进程状态。单个线程可以“做一件事”:执行计算、与网络交互、更新UI、解码视频等。但是,如果没有程序员的大量额外工作,单个线程无法同时完成所有这些任务。在一个进程中有多个线程使程序员能够轻松地使一个应用程序同时执行多个任务(多任务)

不过,使用多线程确实带来了一些新的挑战。例如,如果有两个线程访问同一个变量,则可能会出现并发风险,其中一个线程可能无法在另一个线程访问变量之前完全更新该变量,从而导致程序失败。Objective-C将默认生成线程安全代码,以避免这种情况
nonatomic
告诉编译器,您永远不会同时从多个线程访问它,因此编译器可以跳过线程安全代码,生成更快的代码。无论如何,如果您要提供自己的同步,这将非常有用(例如,保持一组属性同步,而Objective-C本身无法帮助您)

如果您违反了核心
非原子
假设,同时从多个线程访问
非原子
变量,所有的地狱都将破灭

对非原子的解释是,它意味着不必担心多个线程试图同时访问对象,objective-c不必合成线程安全代码。那么这到底意味着什么呢

想象你被要求在一张纸上写下你的名字。您收到了一份有人认为可以正常工作的指示列表:

  • 您发现一行当前为空
  • 把你的笔移到上面
  • 写下你的名字
一切都好

现在,假设你收到一张新的纸,但是你和其他人都被要求在同一张纸上写下你的名字,并且你收到了旧的指示,也许:

1) 你们俩都看了看纸,决定写第一行。 2) 你放下笔(也许你们两个都能很舒服地完成——一个左手/一个右手)。 3) 你开始写I,但另一个人写J,结果看起来像U。 4) 从这里开始变得更糟

但同样地,你可能会更加注意,在他们开始寻找空行之前写完你的名字,反之亦然

线程非常像这样。。。在上面的例子中,每个线程/人员都在跟踪他们在任务中的进展情况,严格按照他们的指示执行。请注意,如果您只完成了第1步,那么另一个人就完成了第1步,那么您已经为自己做好了准备,无论其余步骤的顺序或并发性如何,都要在对方的名字上写上自己的名字

在所有这一切中,你甚至不必在同一时间做任何事情,只是跟踪你的任务是独立的-你是独立的人,有你自己的记忆在你的任务中。线程也是一样——它们是独立跟踪要做什么的方法,并且它们是否在同一时刻在程序中实际做事情是可选的(这在多核CPU和多CPU系统中是可能的)

“原子”是在不可分割的意义上使用的(想想:你不能把一个金原子切成两半而仍然有金)。类似地,如果你说以原子的方式写下你的名字,这意味着任何观察者都可以保证在没有名字的情况下看到你的名字之前的那一刻,或者在完全写下你的名字之后的那一刻,但他们永远不会看到你的一半。字符串变量的原子更新是这样的

原子字符串更新无法解决上述问题。。。您在查找“空行”(在计算上下文中,比如在容器中查找下一个空位置)时可能仍然会发生冲突。如果查找空行的过程是原子性的,并且在您自己写任何东西之前,该行就以某种方式标记为“已使用”,那么这意味着您将永远无法获得与其他人相同的行。在这一阶段,多人在同一行上写名字不会发生冲突,但只有在找行和写名字都是原子的情况下,看报纸的人才能知道他们看到的是完全没有冲突的名字


做出这样的保证非常有用,但代价高昂。这意味着线程之间必须进行通信和协调,商定“谁”将首先执行,其他线程将在必要时等待。

只需说一些与进程中的其他线程同时运行的内容就足够了吗?代码一次执行一行(我相信您一定很熟悉)。当您使用多线程时,您将同时运行多行代码。例如,当您在后台下载文件时,用户可能正在滚动视图。现在,如果用户单击一个按钮,他们可能正在执行另一段代码。假设他们单击的按钮编辑的变量与下载函数当前编辑的变量相同。如果某些东西不是线程安全的,那么您将在这方面遇到问题。使用线程保存的东西,操作系统将优雅地处理它