什么是线程

时间:2013-02-14 03:14:59

标签: c++ objective-c multithreading

我一直在线查看线程是什么,我不觉得我理解它。有人可以对此有所了解吗?在与C ++相关的编程语言方面,objective-C会很好。

在objective-c中,我遇到了

@property(nonatomic, strong) NSString *name;

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

2 个答案:

答案 0 :(得分:6)

进程可以包含多个执行线程,逻辑上可以认为它们是并行运行的。每个线程独立运行,但共享相同的内存和进程状态。单个线程可以“做一件事”:执行计算,与网络交互,更新UI,解码视频等。但是,如果没有重要,单个线程不能同时执行所有这些操作程序员的额外工作量。在一个进程中拥有多个线程使程序员能够轻松地使应用程序同时执行多项操作(多任务处理)。

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

如果您违反核心nonatomic假设并同时从多个线程访问nonatomic变量,那么一切都将破裂。

答案 1 :(得分:4)

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

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

  • 你找到一条当前为空的行,
  • 将笔移到它上面,
  • 写下你的名字。

一切都很好。

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

1)你们看看报纸并决定在第一行写字。 2)你把你的笔放下(也许你可以做得足够舒服 - 一个左手/一个右手)。 3)你开始写一个我,但另一个人正在写一个J,它看起来像一个U. 4)从这里变得更糟......

但同样地,可能是你需要更多关注,并在开始寻找空行之前写完你的名字,反之亦然。

线程很像这样......在上面的例子中,每个线程/人都在跟踪他们在任务中的进展情况,按照他们的指示非常字面地说。请注意,如果您只完成第1步,那么另一个人执行第1步,您已经设置了自己写的名字,而不管其余步骤的顺序或并发性。

在这一切中,你甚至不必在同一时刻做事,只是跟踪你的任务是独立的 - 你是独立的人,你有自己的记忆,你在你的位置任务。与线程相同 - 它们是跟踪独立操作的方式,并且它们是否可以在同一时刻在程序中实际执行(可以使用多核CPU和多CPU系统)。

“原子”用于不可分割的意义上(想想:你不能将原子金切成两半而仍然有金)。同样地,如果你说原子上写下你的名字,这意味着任何观察者都要保证要见证之前的瞬间 - 当没有名字的时候 - 或者之后的瞬间 - 当你的名字被完全写完 - 但他们永远不会看到你的一半名称。字符串变量的原子更新就是这样。

原子字符串更新无法解决上述问题...您可能仍会在查找“空行”时发生冲突(在计算环境中 - 例如找到容器中的下一个空位)。如果找到一个空行的过程是原子的,并且该行在某种程度上被标记为“已使用”,甚至在您自己写入任何内容之前,那么这意味着您将永远不会像其他人那样获得相同的行。在那个阶段,多个人写他们的名字不会在同一条线上发生冲突,但只有当线条发现和名字写作都是原子的时候,人们才能看到这篇论文知道他们看到的是完全写好的非冲突名字。

提供这些保证非常有用但价格昂贵。这意味着线程必须相互通信和协调,同意“谁”将首先与其他人一起等待。