Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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
C 结构对象数组-线程安全_C_Multithreading - Fatal编程技术网

C 结构对象数组-线程安全

C 结构对象数组-线程安全,c,multithreading,C,Multithreading,我有一个由多个线程并发访问的结构对象的全局数组。但是,可以保证每次由两个不同线程访问的struct对象的各个数据成员(在特定数组索引处)总是不同的 我的问题是是否需要在这个全局数组上设置互斥锁才能访问它。 我的结构如下所示: struct data{ string a; int b; uint16_t c; }; 编辑: 我有一个多线程UDP服务器程序,它创建固定数量的线程,并在同一个全局UDP套接字上执行recvfrom()块。无论哪个线程首先接收到数据报,都将处理该数据报

我有一个由多个线程并发访问的结构对象的全局数组。但是,可以保证每次由两个不同线程访问的struct对象的各个数据成员(在特定数组索引处)总是不同的

我的问题是是否需要在这个全局数组上设置互斥锁才能访问它。

我的结构如下所示:

struct data{
   string a;
   int b;
   uint16_t c;
};
编辑:


我有一个多线程UDP服务器程序,它创建固定数量的线程,并在同一个全局UDP套接字上执行recvfrom()块。无论哪个线程首先接收到数据报,都将处理该数据报。在这种情况下,为了方便客户机数据的存储,我使用了这个全局对象数组。在我的例子中,对数据成员的处理将按以下顺序进行:
字符串a、int b、uint16\u t c
。没有两个线程会访问同一对象的同一数据成员,因为客户端不会发送对
项b
的请求,直到它收到
项a
的响应,并且数组被客户端编号索引。

基本上,如果有100%的保证,即两个不同的线程不会同时接触内存中的同一位置,就不需要使用互斥锁

但是,如果您仅99.99%确定它不会同时被触摸,那么您肯定需要一个互斥锁

另一方面,互斥锁的使用会以任何方式影响您的应用程序吗?因为,如果不是这样的话,为了安全起见,可能需要添加一个互斥锁,以防某些东西不能完全按照您的预期运行

但是,可以保证每次由两个不同线程访问的struct对象的各个数据成员总是不同的

如果不是通过某种方式同步线程,您如何保证这一点

如果您的意思是线程“a”总是只访问成员“a”,而线程“b”总是只访问成员“b”,那么您就不需要锁或其他同步

否则,您将需要一些同步。为struct对象创建互斥锁是一种方法。您提到的保证可以通过为单个结构成员提供互斥体或为访问其中一个成员的代码部分提供关键部分来实现


所以,如果你真的能保证,不,你不需要另一个互斥。但这意味着您已经有了一些同步。

如果线程1有可能需要读取线程2所做的更新,那么您必须使用某种同步—原子访问或互斥。如果没有这些,更新可能不可见。

在结构中进行一些填充,以确保访问两个相邻实例不会重叠。考虑:

struct data th[2];

想象一下内存中的符号布局:
0000011111
。如果第一个线程开始写入th[0],第二个线程开始读取th[1],则根据对齐方式的不同,一些线程可能会重叠。考虑8个符号的对齐方式:<代码> WWWWWW 111 < /代码>。那么,在结束写入和还原之前,第二个结构的前两个符号在读取时将不一致
wwwww 11111

您如何知道两个不同的线程不会同时使用同一对象?@E先生-索引可能按偶数/奇数、下三分之一、中三分之一、上三分之一在线程上分布,在这种情况下,两个不同的线程永远不会使用同一个对象,但是OP说两个线程不会同时使用同一个对象。