You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求SWI-Prolog多线程程序同步的简单示例

SWI-Prolog多线程同步简单示例

下面是一个基于互斥锁(mutex)的多线程同步示例,用来解决多个线程修改共享变量时的竞态问题:

% 初始化共享计数器
counter(0).

% 递增计数器的原子操作,用互斥锁保护临界区
increment_counter(Mutex) :-
    mutex_lock(Mutex),
    retract(counter(Old)),
    New is Old + 1,
    assertz(counter(New)),
    mutex_unlock(Mutex).

% 线程执行的任务:重复递增计数器100次
thread_task(Mutex) :-
    repeat,
    increment_counter(Mutex),
    counter(Value),
    Value >= 1000, % 总递增次数:10线程×100次=1000
    !.

% 主程序:创建互斥锁、启动线程、等待完成、清理
main :-
    mutex_create(Mutex),
    % 创建10个工作线程
    findall(Thread, between(1,10, _), Threads),
    maplist(thread_create(thread_task(Mutex)), Threads),
    % 等待所有线程结束
    maplist(thread_join, Threads),
    % 输出最终计数器值
    counter(Value),
    format('最终计数器值:~w~n', [Value]),
    % 销毁互斥锁
    mutex_destroy(Mutex).

代码说明:

  • mutex_create(Mutex):创建一个互斥锁,用于控制对共享资源的访问
  • thread_create(Goal, ThreadId):创建新线程执行指定目标(这里是thread_task(Mutex))
  • mutex_lock(Mutex) / mutex_unlock(Mutex):包裹临界区代码(修改共享计数器的操作),确保同一时间只有一个线程能执行这段代码,避免竞态条件
  • thread_join(ThreadId):等待指定线程执行完毕,保证主程序在所有工作线程结束后再继续执行
  • mutex_destroy(Mutex):不再需要互斥锁时销毁它,释放资源

你可以在SWI-Prolog中直接运行这个示例,执行main.就能看到最终计数器稳定输出1000——如果没有同步机制,最终值大概率会小于1000,因为多个线程可能同时读取和修改计数器,导致数值覆盖。

内容的提问来源于stack exchange,提问作者harsh bijwe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:20:42