回答
在 Hamibot 中编写同步代码主要依赖于 threads 模块提供的锁机制,用于避免多线程环境下资源竞争或数据不一致的问题。以下是几种常用的同步代码编写方法:
1. 使用 sync 函数
sync 可以对函数进行同步包装,确保同一时间只有一个线程执行该函数。
// 文档地址 https://docs.hamibot.com/
var counter = 0;
// 使用 sync 包装函数,保证操作的原子性
var syncIncrement = sync(function() {
counter++;
});
threads.start(function() {
for (var i = 0; i < 1000; i++) {
syncIncrement();
}
});
threads.start(function() {
for (var i = 0; i < 1000; i++) {
syncIncrement();
}
});
// 等待线程执行完成
threads.shutDownAll();
toast("最终计数: " + counter);
2. 使用 Lock 对象进行精细控制
如果需要对代码块进行更精细的同步控制,可以使用 threads.lock() 创建锁对象:
// 文档地址 https://docs.hamibot.com/
var lock = threads.lock();
var sharedData = 0;
threads.start(function() {
for (var i = 0; i < 1000; i++) {
lock.lock();
sharedData++;
lock.unlock();
}
});
threads.start(function() {
for (var i = 0; i < 1000; i++) {
lock.lock();
sharedData++;
lock.unlock();
}
});
threads.shutDownAll();
toast("最终结果: " + sharedData);
3. 线程间通信与同步
如果涉及线程间数据传递或条件等待,可以使用 threads.disposable() 或 Condition:
// 文档地址 https://docs.hamibot.com/
// 使用 disposable 等待子线程结果
var result = threads.disposable();
threads.start(function() {
var sum = 0;
for (var i = 1; i <= 10000; i++) {
sum += i;
}
result.setAndNotify(sum);
});
toast("计算结果: " + result.blockedGet());
4. 使用 Condition 进行线程协调
// 文档地址 https://docs.hamibot.com/
var lock = threads.lock();
var condition = lock.newCondition();
var isReady = false;
threads.start(function() {
// 模拟耗时任务
sleep(2000);
lock.lock();
isReady = true;
condition.signal(); // 通知等待的线程
lock.unlock();
});
lock.lock();
while (!isReady) {
condition.await(); // 等待条件满足
}
lock.unlock();
toast("任务已完成");
⚠️ 注意事项:
- 不要使用
Array等非线程安全对象:在多线程中直接操作数组可能导致数据错乱,应使用锁保护或改用线程安全的数据结构。 - 避免在同步块中执行耗时操作:否则会阻塞其他线程,影响性能。
- 确保及时释放锁:使用
lock()后务必在 finally 或合适的地方调用unlock()。
如果你有具体的同步场景或问题,可以提供更多细节,我可以给出更针对性的建议。
ℹ️ 本回答由 AI 生成,内容仅供参考