在并发读取中是否使用互斥 在Linux我正在用C++编程,我正在使用pToX库。我使用互斥来保护一些共享变量,但我不确定在这种特定情况下是否有必要使用互斥
我有三条线。共享变量是一个字符串全局变量在并发读取中是否使用互斥 在Linux我正在用C++编程,我正在使用pToX库。我使用互斥来保护一些共享变量,但我不确定在这种特定情况下是否有必要使用互斥,c++,multithreading,mutex,C++,Multithreading,Mutex,我有三条线。共享变量是一个字符串全局变量 Thread1更改它的值,然后thread2和thread3读取它的值并存储在另一个字符串中 在本例中,字符串的值仅由一个线程修改。在由两个线程并发读取的过程中,仍然有必要使用互斥来保护共享变量吗?如果您不想将C++14/17用于C++14,那么您应该使用一个从中获取它的方法。然后,如果你想读字符串,你做一个,如果你想在上面写,你做一个 如果两个共享锁相遇,它们不会碰撞,也不会阻塞,但共享锁和唯一锁会碰撞,其中一个锁会阻塞,直到另一个锁完成。因为您使用的
Thread1更改它的值,然后thread2和thread3读取它的值并存储在另一个字符串中 在本例中,字符串的值仅由一个线程修改。在由两个线程并发读取的过程中,仍然有必要使用互斥来保护共享变量吗?如果您不想将C++14/17用于C++14,那么您应该使用一个从中获取它的方法。然后,如果你想读字符串,你做一个,如果你想在上面写,你做一个
如果两个共享锁相遇,它们不会碰撞,也不会阻塞,但共享锁和唯一锁会碰撞,其中一个锁会阻塞,直到另一个锁完成。因为您使用的是pthread,所以可以使用pthread\r\t 要更新对象,需要获得写锁;所有读卡器只有在获得共享读锁后才能访问该对象。由于写锁是独占的,而读锁是共享的,因此您将获得所需的行为 关于使用pthread\u rwlock\t读/写锁的示例,请访问 关于pthread_rwlock_t lock上可用调用的详细摘要,请访问。我复制了列出操作的表格:
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)"
Thread1更改其值,然后…-如果after意味着其他线程是在更改后创建的,则不需要互斥锁;线程创建同步内存。如果这意味着什么,那么您需要某种形式的同步,部分原因是,如果没有同步,不同线程中的同步将毫无意义。只要至少有一个线程修改对象,您就需要一个互斥对象。您不需要它的唯一情况是当每个人都在阅读时。但是线程2和线程3仅在线程1已经修改了字符串的值时读取该字符串的值。如果您可以确保线程1在其他任何线程尝试读取该字符串之前已完成对该字符串的修改,然后你的处境是每个人都在读:不需要互斥。太好了!非常感谢!在标准的范围内,肯定会有:至少有一个是写入的非同步同步同步访问称为竞争条件,并触发未定义的行为。有些平台能够对某些简单的数据类型执行无锁原子操作,但您不能再依赖该标准了。为了解决这个问题,您需要使用std::atomic,它将被转换为平台的最佳操作,如果没有其他可用的话,它将降级为互斥。我正在使用pthreads库,我不想更改它。即便如此,还是要感谢您的回答。@JulenUranga实际上,您是否在使用pthreads是无关紧要的。锁不关你的事!我知道!但是我想维护这个结构,并使用与线程相关的相同功能继续这个项目:@JulenUranga,我理解。这一点都不是坏事。但是,如果找不到其他解决方案,请将共享互斥解决方案作为最后手段。此外,它是标准库的一部分,因此您不必为它添加额外的特殊库。干杯:正如你所说的,在不同的线程中,没有同步就没有意义。同步是使用互斥的。因此,没有必要保护它们。谢谢大家!@互斥不能保证某件事发生在另一件事之后。它所做的只是确保它们不会同时发生。如果需要让一个线程在另一个线程写入值后读取该值,则需要某种方式来告知该值已经写入。