我在Linux中用C ++编程,我使用的是pthreads库。我使用互斥锁来保护一些共享变量,但我不确定在这种特殊情况下是否需要使用互斥锁。
我有3个帖子。共享变量是一个字符串(全局变量)。
Thread1更改了它的值,然后,thread2和thread3读取它的值并存储在另一个字符串中。
在这种情况下,字符串的值仅由一个线程修改。是否仍然需要使用互斥锁来保护两个线程并发读取中的共享变量?
答案 0 :(得分:2)
“Thread1更改它的值,之后......” - 如果“之后”意味着更改后其他线程创建,则不需要互斥锁;线程创建同步内存。如果它意味着什么,那么你需要某种形式的同步,部分原因是因为在不同的线程中“后来”没有同步就没有意义。
答案 1 :(得分:1)
你应该使用的是shared_mutex(如果你不想使用C ++ 14/17,请从boost获取)(对于C ++ 14,那里'你可以使用sa shared_timed_mutex。然后,如果要读取字符串,则执行shared_lock;如果要在其上书写,则执行unique_lock。
如果两个共享锁相遇,它们不会发生冲突而且它们不会阻塞,但共享锁和唯一锁会发生冲突,其中一个锁会阻塞,直到另一个完成。
答案 2 :(得分:0)
由于您使用的是pthread,因此可以使用pthread_rwlock_t
。
为了更新对象,获取写锁定将是locked using pthread_rwlock_wrlock()
;所有读者只有在获得共享读锁with pthread_rwlock_rdlock()
后才能访问该对象。由于写锁是独占的,并且读锁是共享的,因此您将获得所需的行为。
可以在http://www.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.genprogc/using_readwrite_locks.htm找到使用pthread_rwlock_t
读/写锁的示例。
可以在https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.html找到有关pthread_rwlock_t
锁定使用的可用呼叫的完整摘要。我已经复制了列出操作的表格:
Operation
Initialize a read-write lock "pthread_rwlock_init(3THR)"
Read lock on read-write lock "pthread_rwlock_rdlock(3THR)"
Read lock with a nonblocking read-write lock "pthread_rwlock_tryrdlock(3THR)"
Write lock on read-write lock "pthread_rwlock_wrlock(3THR)"
Write lock with a nonblocking read-write lock "pthread_rwlock_trywrlock(3THR)"
Unlock a read-write lock "pthread_rwlock_unlock(3THR)"
Destroy a read-write lock "pthread_rwlock_destroy(3THR)"