Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 通过计数测试信号量_Multithreading_Semaphore - Fatal编程技术网

Multithreading 通过计数测试信号量

Multithreading 通过计数测试信号量,multithreading,semaphore,Multithreading,Semaphore,这里有一个。作者通过在两个线程中递增和递减一个静态变量来测试信号量。当信号量保护变量访问时,变量最终为零。没有保护,变量最终会有一些虚假的值。我试过这个代码,它成功了。我不明白的是,来自两个线程的并发访问如何影响最终变量值。毕竟,在我看来,这就像是一堆+1和–1,应该是互补的,对吧?我觉得我错过了一些显而易见的东西,那是什么 问题是++/-不是原子的。它们基本上是三种操作: 负载 公司/十二月 百货商店 所以,若两个线程同时加载值并同时存储它。差值将是1而不是2 这是样品 Thread A Th

这里有一个。作者通过在两个线程中递增和递减一个静态变量来测试信号量。当信号量保护变量访问时,变量最终为零。没有保护,变量最终会有一些虚假的值。我试过这个代码,它成功了。我不明白的是,来自两个线程的并发访问如何影响最终变量值。毕竟,在我看来,这就像是一堆+1和–1,应该是互补的,对吧?我觉得我错过了一些显而易见的东西,那是什么

问题是++/-不是原子的。它们基本上是三种操作:

负载 公司/十二月 百货商店 所以,若两个线程同时加载值并同时存储它。差值将是1而不是2

这是样品

Thread A Thread B
Load 5   Load 5
Inc 6    Inc 6
Store 6  Store 6
问题是++/-不是原子的。它们基本上是三种操作:

负载 公司/十二月 百货商店 所以,若两个线程同时加载值并同时存储它。差值将是1而不是2

这是样品

Thread A Thread B
Load 5   Load 5
Inc 6    Inc 6
Store 6  Store 6

啊哈,我不知道非原子性。谢谢@zoul为了能够编写多线程程序,您应该学习它和其他许多知识:我承认我对多线程知之甚少。但是像@synchronized、grandcentraldispatch或我的例子中的各种锁定类这样的现代线程工具使许多事情变得简单,因此人们可以在不知道原子增量的情况下取得惊人的进展:@zoul这是一个关键的错觉。它们让人们可以轻松地编写代码,但代码的安全性、质量和健壮性仍然取决于开发人员对基本概念的知识和理解。它们是工具,但不是为你思考的设备。关键是它们通常更容易思考,因此更容易正确。例如,@synchronized指令将简单地保护关键部分,防止并发访问。我敢说,我可以在不了解原子性的情况下有效地、正确地使用这样的工具。啊哈,我不知道非原子性。谢谢@zoul为了能够编写多线程程序,您应该学习它和其他许多知识:我承认我对多线程知之甚少。但是像@synchronized、grandcentraldispatch或我的例子中的各种锁定类这样的现代线程工具使许多事情变得简单,因此人们可以在不知道原子增量的情况下取得惊人的进展:@zoul这是一个关键的错觉。它们让人们可以轻松地编写代码,但代码的安全性、质量和健壮性仍然取决于开发人员对基本概念的知识和理解。它们是工具,但不是为你思考的设备。关键是它们通常更容易思考,因此更容易正确。例如,@synchronized指令将简单地保护关键部分,防止并发访问。我想冒昧地说,我可以在不了解原子性的情况下有效地、正确地使用这样一个工具。