在非OOP编程语言中,如C,如果我们只允许局部变量以各种可能的方式进行变异(改变内部字段,重新赋值......),但不允许函数变量的变异,它是否会帮助我们防止共享可变状态?如果我们只允许局部变量是可变的,我们可以防止共享可变状态吗?
注意,在这种情况下,功能main
可以开始10个线程(功能),并且每个这些10个线程的将接收的不可变参照同变量(在main
定义)。但main
函数仍然可以更改该共享变量的值。那么这会在并行/并行软件中造成问题吗?
我希望问题很清楚,但是让我知道如果不是。
P.S. “软件事务内存(STM)”能够解决潜在的问题吗?就像Clojure提供的一样?
'main'与其他线程没有区别。因此,如果单个线程更改共享变量,则在所描述的情况下,您将拥有完全相同的多线程问题。 – 4386427
@ 4386427注意到只有一个线程被允许写入内存的假设。所有其他线程只读...仍然有问题(我在写答案),但通常人们认为这有助于。 – Myst
如果'main()'修改了变量,但是线程应该从中读取不同的值,那么您还没有解决问题。这可能是POSIX pthreads的一个问题。 'pthread_create()'函数接受一个'void *'最后一个参数,而一个常见的错误是传递一个循环控制变量的地址 - 这意味着线程无法知道它们将读取什么内容(值可能已经改变在函数被调用和线程启动之间)。 –