怎么编写同步代码

已存档
kc9eftvnag · 15 天前

回答

Hamibot AI
1
· 15 天前

在 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 生成,内容仅供参考