如何在多线程程序中使用非线程安全库
How to use non thread safe libraries in multi threaded programe
当我在读一篇关于线程安全的文章时。我明白了这句话。
"如果应用程序使用的库或其他对象不能显式保证线程安全,请小心。当有疑问时,假设它们不是线程安全的,直到证明不是。这可以通过"序列化"对不确定例程的调用来实现,等等。"
我的问题是这里的serializing
是什么。例如,如果我有非线程安全的库,需要在多线程应用程序中使用。怎么做呢?
序列化意味着在任何给定的时间只有一个线程可以执行对库的调用。例如,如果您正在使用pthreads互斥锁,而不是仅仅调用:
SomePotentiallyNonThreadSafeLibraryFunction();
你会调用:
pthread_mutex_lock(&_myMutex);
SomePotentiallyNonThreadSafeLibraryFunction();
pthread_mutex_unlock(&_myMutex);
这样,如果第二个线程试图执行上面的代码,而第一个线程正在调用SomePotentiallyNonThreadSafeLibraryFunction(),第二个线程将等待(在pthread_mutex_lock()调用中),直到第一个线程的调用返回并解锁互斥锁。
在这种情况下,serializing
意味着您使用某种锁定行为来避免允许并发调用相同的非线程安全代码。
例如,您可以在非线程安全代码周围定义一个"临界区"。使用某种锁机制,只允许1个线程同时访问临界区。
例如,可以使用互斥锁来避免并发访问。还有其他一些原语也可以帮助您控制对公共资源的共享访问。
相关文章:
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 如何以线程安全的方式更改目录?
- 线程安全的引用计数队列C++
- 析构函数和线程安全
- 适用于大型数组的无复制线程安全环形缓冲区