当前位置: 技术问答>linux和unix
linux多线程数据共享策略问题?
来源: 互联网 发布时间:2016-04-03
本文导语: 我有一个结构,如 struct my{ int a; int b; char c; char d; shoar e; } 这是一个全局的共享的数据。有多个线程要访问这个结构,对整个结构的数据做处理。 如果每个线程在处理数据前都加mutex锁,处理完了以后再解锁,效率...
我有一个结构,如
struct my{
int a;
int b;
char c;
char d;
shoar e;
}
这是一个全局的共享的数据。有多个线程要访问这个结构,对整个结构的数据做处理。
如果每个线程在处理数据前都加mutex锁,处理完了以后再解锁,效率肯定有问题。
因为每个线程要在处理这个结构的数据。失去了多线程的意义。
如果我把全局的这个数据在每次处理前拷贝一个临时变量,处理的时候处理临时变量,处理完了再
写入全局。这样的方法会造成这个全局的数据不同步。肯定也有问题。
那么我想问下,正确的应该是怎么样做的呢?采取怎样的方法的呢?不知道我的问题说清楚没有
struct my{
int a;
int b;
char c;
char d;
shoar e;
}
这是一个全局的共享的数据。有多个线程要访问这个结构,对整个结构的数据做处理。
如果每个线程在处理数据前都加mutex锁,处理完了以后再解锁,效率肯定有问题。
因为每个线程要在处理这个结构的数据。失去了多线程的意义。
如果我把全局的这个数据在每次处理前拷贝一个临时变量,处理的时候处理临时变量,处理完了再
写入全局。这样的方法会造成这个全局的数据不同步。肯定也有问题。
那么我想问下,正确的应该是怎么样做的呢?采取怎样的方法的呢?不知道我的问题说清楚没有
|
....
4,5,6楼都说完了
4,5,6楼都说完了
|
1.读写锁
2.如果该struct每个数据成员之间没有“一致性”关系(一致性:例如a永远是b的2倍),那就可以每个数据成员上1把锁,从而减少多线程争用锁的几率。虽然多几把锁会增加一些开销,但是如果struct成员不多且多线程对该数据结构访问频繁,还是值得的。
2.如果该struct每个数据成员之间没有“一致性”关系(一致性:例如a永远是b的2倍),那就可以每个数据成员上1把锁,从而减少多线程争用锁的几率。虽然多几把锁会增加一些开销,但是如果struct成员不多且多线程对该数据结构访问频繁,还是值得的。
|
使用读写锁的方式可以稍微提高效率。
另外,只要你加锁部分的代码足够简短,你根本不用担心效率的问题。
另外,只要你加锁部分的代码足够简短,你根本不用担心效率的问题。
|
这在多线程编程中是在所难免的,要保证共享数据的完整性只能以牺牲效率为代价。所以在多线程编程中应尽量减少共享数据的使用。还有每个线程拥有锁定时间应该尽量短。