【发布时间】:2017-11-14 06:48:36
【问题描述】:
在非 OOP 编程语言中,例如 C,如果我们只允许局部变量以各种可能的方式进行变异(更改内部字段、重新分配,...)但不允许函数参数的变异,会有帮助吗?我们阻止共享可变状态?
请注意,在这种情况下,函数 main 可以启动 10 个线程(函数),并且这 10 个线程中的每一个都将接收到对同一变量(在 main 中定义)的不可变引用。但是main 函数仍然可以更改该共享变量的值。那么这会导致并发/并行软件出现问题吗?
我希望问题很清楚,但如果不是,请告诉我。
附: “软件事务内存(STM)”能否解决潜在问题?喜欢 Clojure 提供的功能吗?
【问题讨论】:
-
main与任何其他线程没有什么不同。因此,在所描述的情况下,如果单个线程更改共享变量,您将遇到完全相同的多线程问题。 -
@4386427 注意只允许一个线程写入内存的假设。所有其他线程只读取...仍然存在问题(我正在写一个答案),但人们通常认为这会有所帮助。
-
如果
main()修改了变量但线程应该从中读取不同的值,那么您还没有解决问题。这可能是 POSIX pthread 的问题。pthread_create()函数接受void *最后一个参数,一个常见的错误是传递循环控制变量的地址——这意味着线程无法知道它们将要读取什么(值可能在函数被调用并启动线程)。 -
这并不能解决任何问题
-
@mahdix ,感谢您说清楚。我认为这不能为代码提供足够的保护,即使与
volatile关键字结合使用,正如我的回答中所解释的那样。
标签: c multithreading concurrency clojure immutability