Akh*_*hil 0 c multithreading volatile
嗨我最近用以下骨架编写了一个代码:
variable;
callback(){
//variable updated here
}
thread_function(){
//variable used
}
main(){
//callback registered
//thread registered
}
Run Code Online (Sandbox Code Playgroud)
我发现无论何时variable在回调时更新,它都会在线程中自动更新,而不会将其声明variable为volatile.好吧,我不清楚它是如何管理的.先感谢您.之间,从使用代码编译的库中调用callback().
小智 6
好的,首先,它已被打破.你很幸运,你的编译器创建的代码偶然会起作用(或者可能不吉利,因为它可以隐藏极端情况下的细微错误).
我发现每当变量在回调时更新时,它会在线程中自动更新,而不会将变量声明为volatile.好吧,我不清楚它是如何管理的.
从这里开始:它是同一个变量.线程共享相同的地址空间.所以,这就是你天真的期待.
volatile是关于优化.AC编译器可以自由地对代码进行大量修改以使其更快,这包括重新排序语句,而不是读取访问变量,因为相同的值在寄存器中,甚至"展开"循环等等.通常情况下,唯一的限制是可观察行为保持不变(谷歌为此,我不想在这里写一本书.)
从普通内存中读取变量不会产生任何副作用,因此可以合法地忽略它而不改变行为.C(在c11之前)不知道线程.如果未在代码的某些部分写入变量,则假定它保持与以前相同的值.
现在,是什么volatile让你告诉编译器这不是正常的内存,而是一个可以在你的程序控制之外改变的位置(比如一个内存映射的I/O寄存器).有了volatile,编译器必须实际获取任何读操作的变量,并实际存储它用于任何写操作.它也不允许重新排序几个volatile变量之间的访问.但这就是全部,并不足以同步线程.为此,您还需要保证在变量访问时不会重新排序其他内存访问或代码执行,即使使用多处理器 - >您需要内存屏障.
请注意,这与例如java不同,volatile它提供了线程同步所需的内容.在c中,使用pthreads库提供的内容:互斥锁,信号量和条件变量.
您的代码意外地正常工作.在c中,volatile对于线程是错误的(并且是不必要的),请使用由提供的同步原语pthreads.