Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在并发读取中是否使用互斥 在Linux我正在用C++编程,我正在使用pToX库。我使用互斥来保护一些共享变量,但我不确定在这种特定情况下是否有必要使用互斥_C++_Multithreading_Mutex - Fatal编程技术网

在并发读取中是否使用互斥 在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,我理解。这一点都不是坏事。但是,如果找不到其他解决方案,请将共享互斥解决方案作为最后手段。此外,它是标准库的一部分,因此您不必为它添加额外的特殊库。干杯:正如你所说的,在不同的线程中,没有同步就没有意义。同步是使用互斥的。因此,没有必要保护它们。谢谢大家!@互斥不能保证某件事发生在另一件事之后。它所做的只是确保它们不会同时发生。如果需要让一个线程在另一个线程写入值后读取该值,则需要某种方式来告知该值已经写入。