求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
相关产品推荐
相关产品推荐

