从这里我读到
即使调用使用共享数据,也可以从多个线程同时调用线程安全函数,因为对共享数据的所有引用都是序列化的。
我知道要使一段代码线程安全,我们使用锁,这样一次只有一个线程可以访问它。但是这里它说可以同时调用线程安全函数,因为它的所有数据都是序列化的。我不明白序列化引用如何使函数线程安全?谢谢。
从这里我读到
即使调用使用共享数据,也可以从多个线程同时调用线程安全函数,因为对共享数据的所有引用都是序列化的。
我知道要使一段代码线程安全,我们使用锁,这样一次只有一个线程可以访问它。但是这里它说可以同时调用线程安全函数,因为它的所有数据都是序列化的。我不明白序列化引用如何使函数线程安全?谢谢。
我不明白序列化引用如何使函数线程安全?
你有点误会了。它不是序列化引用,而是序列化对引用的访问。
现在,当您使用锁来保护引用时,一次只能由单个线程使用对引用的访问。所以它是串行的而不是并行的。因此线程安全。
序列化有时是锁定的同义词。阅读本文的“线程安全”部分,您将看到它们用于QMutexLocker
访问全局数据。为什么他们称之为序列化?因为代码的所有关键部分都受到互斥锁的保护,并且实际上是串行运行的,即使从不同的线程执行也是如此。
有时,多线程环境中的序列化意味着将并发请求重定向到具有传入命令队列的单个线程,并串行处理这些请求。意思是一样的——并发请求是序列化的,即不能并行执行。
好吧,我猜通过序列化你的意思是排队,你可以在这里找到原因解释:
线程安全的一般思想是消除资源共享:
通过使用队列来保持任务有序,您可以从队列中弹出每个请求,因此请求的处理是序列化的而不是并行的(这解决了我希望的问题)。
“hold and wait”——意思是你把一切都当成一个坑,而不是一一请求资源
“不抢占” - 并不总是可能或有效的,但这意味着可以从已经使用它的进程中获取资源。
“循环等待” - 对所有资源进行编号的好算法,并且总是从低数到高数获取,导致“循环”请求顺序,总有一个可以完成任务并将资源释放给另一个。