multithreading - 线程和同步

标签 multithreading synchronization pthreads

我对线程和同步的工作原理感到困惑。我正在解决一个示例问题,描述如下:

有两个线程:P 和 Q。变量 counter 由两个线程共享。 一个线程中计数器的修改对于另一个线程是可见的。这 增量指令给变量加一,存储新值。

1   global integer counter = 0
2
3   thread P()
4       incr(counter)
5       print counter
6   end
7
8   thread Q()
9       print counter
10      incr(counter)
11      print counter
12      incr(counter)
13  end

共有三个打印语句输出计数器的值。在输出中 下面列出,指示给定的输出是否可能,如果是,则给出 P 和 Q 的交错指令(使用线程和行号) 可以导致输出。

示例输出为 122,这可能吗?可以由P4、Q9、Q10、P5、Q11、Q12生成。我无法理解这是如何工作的。

最佳答案

假设线程 P 首先启动并将“counter”加一。然后它被挂起,线程 Q 启动,读取“counter”并打印其值(“1”)。下一个线程 Q 递增“counter”,现在是“2”。然后线程 Q 被挂起,线程 P 继续运行。现在它读取“counter”并打印其值(“2”)。线程 P 终止。线程 Q 继续,读取并打印“counter”(“2”)。然后它将“计数器”增加 1。

因此输出为:“122”

这是一种可能的执行顺序。一般来说,您永远无法判断线程何时被挂起以及何时继续,这就是本练习的重点。通过添加同步机制(本示例完全缺乏),您可以再次控制执行顺序。

关于multithreading - 线程和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226959/

相关文章:

c++ - 在抛出 '__gnu_cxx::recursive_init' 实例后调用终止

java - 限制 Java 中的线程执行处理器周期

java - 设置值后 SharedPreferences 返回默认值

Python:报纸模块——有什么方法可以直接从 URL 获取文章?

c++ - 查找僵尸线程的来源

当前在 Linux 中进行线程编程的正确方法

ruby - 如何跟踪 Ruby 中的死锁

SVN 到 Clearcase 导出

java - Outlook 日历与 Java Web 服务的连接

Android LogCat 不断重复警告 : "Addition of standard header .... not allowed"