域(domain)
介绍域的 概念及使用
- GS中的域(domain)扩展自handle,其中handle有一个Lock和Unlock的机制,而域主要应用了handle里面这个锁的机制。
- domain类似于一个保护壳,每个对象都需要放在一个特定的保护壳里面保护起来。
- 域的出现主要是起到了一个保护对象数据安全的作用,它相当于一个内部实现的互斥锁。
- 如果一个对象不是只读对象,一旦有一个协程调用到这个对象,它就会给对象加锁,这时候其它协程就不能去调用这个对象, 直到这个协程执行完毕,再给对象解锁,此时其它协程才可以调用这个对象。
- 可以通过try_lock锁定当前域,在try_lock块中,这个域不能切出,一旦切出就会报错
用法示例
example.gs
int i = 0;
public void test1()
{
i = i + 1;
printf("i = %d\n", i);
}
public void test2()
{
i = i - 1;
printf("i = %d\n", i);
}
test.gs
import .example;
handle dom = domain.create("example_domain");
object obj = load_static(example, dom);
// 在dom上执行invoke_func_in_dom
coroutine.create_with_domain("example_co", dom, (: invoke_func_in_dom, obj :));
parallel void invoke_func_in_dom(object ob)
{
ob.test1(); // 调用此处时,当前域和对象所在的域一致,因此不需要跨域调用
}
obj=>test2(); // 跨域调用时一定要用跨域(=>)调用,使用(.)调用会出错
信息
当一个协程调用obj的方法时,会尝试进入obj所在的域,而一个域只能有一个协程运行,另外一个协程就无法执行obj的方法了。因此在这个例子中,ob.test1/ob.test2不会同时执行。