线程的规则与限制
线程有独立的运行上下文,独立的变量环境
多线程最让人困惑的是线程间的同步和交互。
线程就象多个在并列的轨道上疾驰的火车,你要在A火车上与B火车上的人交互,或者你想让B火车上的人干什么,你不能直接从火车上把手伸出去跟别的火车上的人拉拉扯扯发生种种亲密的互动。
一种方式是先让所有的火车都停下来,互动完了再继续往前开,需要互动的时候再停下来,这通常需要用到线程同步的锁,在aardio中就是thread.lock(),但实际上在aardio中多线程同步很少需要用到同步锁,所以这里我也就不多讲。
另外一种更先进的方式就是TLS(Thread Local Storage),也就是线程局部存储。
一些编程语言的全局变量是多线程共享的,一次修改多个线程中立即生效,这看起来很方便,其实带来的潜在麻烦会很多,会制造大量混乱的BUG。而aardio自带TLS, 所有变量都是线程局部存储。你不能在多线程间直接共享变量。
交换变量的方法
如果你有一些函数需要被多个线程用到,请他们写到库文件里,然后在任何线程中使用 import 语句导入即可使用。
可以在创建线程时,通过线程的启动参数把变量从一个线程传入另一个线程,例如:
1
thread.invoke( 线程启动函数,"给你的","这也是给你的","如果还想要上车后打我电话" )
多线程共享的变量,必须通过 thread.get() 函数获取,并使用 thread.set() 函数修改其值,thread.table对象对这两个函数做了进一步的封装(伪装成一个普通的表对象)
aardio提供了很多线程间相互调用函数的方法,通过这些调用方式的传参也可以交互变量,具体请查看aardio范例中的多线程范例。
交换变量的规则
在aardio中每个线程有独立的运行上下文、线程有独立的变量环境,有独立的堆栈,所以你不能把包含局部变量闭包的对象从一个线程传到另一个线程,常见的就是调用类创建的对象,因为this就是闭包变量。
另外你也不可以在一个线程中引用库文件,并且把引用的库直接传到另一个线程,因为库文件中通常会大量的使用局部变量闭包,而应该在每个线程中自行导入需要用到的库,一个例子:
import console;
thread.invoke(
function(){
import console;
console.log("线程要自己调用 import console;")
}
)
console.pause(true);
主题数 10 | 今日评论 0 | 今日主题 0 |