multithreading - 在多线程代码(通用Lisp)中使用库函数

标签 multithreading locking shared-libraries common-lisp

当可以从多个线程访问/更新变量时,通常需要保护它免受同时更改的影响。一种有效的方法是使用原子函数来保证互斥访问。例如(sb-ext:atomic-incf *count*)。另一种方法是像(bt:with-lock-held (*lock*) (incf *count*))这样在更新操作周围包裹一个锁,但这有点昂贵。

有没有一种有效的方法可以在多线程代码中包含库函数(例如来自亚历山大图书馆)?例如,是否要从多个线程执行(alexandria:deletef x *list*)?还是需要锁? (ps:我假设deletef需要保护,但不能完全确定。)

最佳答案

您可以使用STMX来获得具有“乐观锁定”的软件交易。

这适用于标记为事务性的类,也可以与库提供的事务性原语一起使用:tcell,tcons等。您需要使用它们,或将其他东西包装到其中。这些结构中的场所可用于场所机器,因此像alexandria:deletef这样的库函数就可以正常工作。

关于multithreading - 在多线程代码(通用Lisp)中使用库函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55961071/

相关文章:

java - MCS锁实现中的问题-JAVA

c - 在 xv6 中创建线程时注册指针

c++ - 将 std::map 对象传递给线程

java - 使用 ScheduledExecutorService 创建计时器

mysql - 这是 innodb 间隙锁错误吗?

c# - FileHelpers在调用engine.ReadNext()方法和readign engine.LineNumber属性之间的线程锁定问题

c++ - 如何在 Linux 上的 C++ 程序中使用共享库(在本例中为 JsonCpp)?

c++ - 如何使用 MySQL Connector 和 Make 设置 C++ 项目

python - ubuntu 构建时未找到库错误

c++ - MFC - 获取特定窗口的设备上下文