C++ 多线程 static method安全问题(顶者有分)

無名小伙 2011-10-31 09:09:27
Example:

我有一个输入输出类 IOClass,当时在做测试的时候,所有的方法/函数 都定义成static。
  class IOClass{

private :
...
static void xxx();
...
public :
...

static void ppppp(VVVV::CCC& ccc, const std::string& mesg);
static void ppppp(VVVV::CCC& ccc, std::istream& in);
static void read_data(const std::string& file_name,std::string &data);
static void read_data_file(const std::string& file_name, std::string& rrr_name, std::string& data,
bool print_flag = true);
static void pmmmmm(const std::string& mesg, std::string& rrr_name, std::string& data,
bool print_flag = true);
static void pmmmmm(std::istream& in, std::string& rrr_name, std::string& data, bool print_flag = true);
...


}

因为read_data是读取文件里面的数据,deal_input是处理输入的数据

要改成多线程访问,如何修改?
1、如果对每个读写操作都加mutex,这样的performance如何提高?
2、如果将static去掉,每一个输入输出的都将会new object,这样内存是不是消耗挺大的?

这个类的功能只是中间处理数据.

请给出具体实例,谢谢,本人是C++初学者。

谢谢帮顶的同志。
...全文
325 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
追求执着 2011-10-31
  • 打赏
  • 举报
回复
無名小伙 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 qq120848369 的回复:]

楼主别乱.

类的static方法和C风格的static方法一丁点区别也没有。

难道多线程问题和static函数有关系么? 一点关系也没有。

为什么写操作要加锁,一是考虑fstream的应用层缓冲,二是考虑系统API写操作非原子性。

操作共享数据可以不加锁么? 除非你觉得脏读不影响程序逻辑,否则就应该加锁,锁性能不是你能修正的,你只能修改架构避免使用锁(例如将写操作的数据通……
[/Quote]

......

有道理!
qq120848369 2011-10-31
  • 打赏
  • 举报
回复
楼主别乱.

类的static方法和C风格的static方法一丁点区别也没有。

难道多线程问题和static函数有关系么? 一点关系也没有。

为什么写操作要加锁,一是考虑fstream的应用层缓冲,二是考虑系统API写操作非原子性。

操作共享数据可以不加锁么? 除非你觉得脏读不影响程序逻辑,否则就应该加锁,锁性能不是你能修正的,你只能修改架构避免使用锁(例如将写操作的数据通过IPC统一送给一个I/O线程,由I/O线程统一负责写入,需要I/O复用)。

编程前先学习必要的基础知识,浮沙筑高楼会悲剧的。
無名小伙 2011-10-31
  • 打赏
  • 举报
回复
实事上,简单一点叙述,请各位帮忙看一看:

对于静态方法

假设有:

static void tsum(int &a ,int &b, int &result)

{

result = a +b;

}



如果是多线程调用些方法,也是安全的吗?



T1.tsum(a,b,c);

T2,tsum(d,e,f);



会不会出现:

c=a+e

f=d+b

这样的结果呢?

hengshan 2011-10-31
  • 打赏
  • 举报
回复
没有共享数据,不存在多线程问题
myhaikuotiankong 2011-10-31
  • 打赏
  • 举报
回复
需要加锁。。。
無名小伙 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 seucs 的回复:]

楼主的IOClass类貌似只是将所有函数封装起来,并没有static数据,所以在类里面没有数据共享导致的一致性问题(除非共享了全局对象),不用mutex,不用去掉static
[/Quote]
这个回答很到点

头文件中申明的static是什么意思?
为什么在定义的时候没有static??

如果只是封装的话,多线程调用,是如何调用?直接IOClass::method1(.....
还是需要
IOClass ioc;
ioc.method1(.....


谢谢你的回答
無名小伙 2011-10-31
  • 打赏
  • 举报
回复
还有一个很奇怪的问题。
前辈在头文件中申明的时候包含static :
static void strip(std::string& s);

在定义的时候没有static ,但程序测试仍然正常。有人知道什么原因吗?
void XXXX::strip(std::string& s)
{
const char *whitespace = " \t\n";
// erase leading whitespace
int index = s.find_first_not_of(whitespace);
if (index >= 0 && index != std::string::npos)
s.erase(0, index);
// erase trailing whitespace (if any)
index = s.length()-1;
while (std::strchr(whitespace, s[index]) && index >= 0)
index--;
s.erase(index+1);
}


看到者,请帮顶一下,本人连续三次回复,如果沉了,没办法再顶起来了。
seucs 2011-10-31
  • 打赏
  • 举报
回复
楼主的IOClass类貌似只是将所有函数封装起来,并没有static数据,所以在类里面没有数据共享导致的一致性问题(除非共享了全局对象),不用mutex,不用去掉static
feizhu004 2011-10-31
  • 打赏
  • 举报
回复
谢谢 线程和进程有时会混起来 菜鸟级
無名小伙 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luciferisnotsatan 的回复:]

无实际代码,不知道怎么改。

至于性能如何提高,先把锁加了,如果的确需要提升时再去想优化方法。
[/Quote]
谢谢你的回答。

现在将static去掉,每个方法/函数的操作都在栈里面完成的,应该不存在不安全问题。

各线程独立享用空间。


加锁的话,锁的原理还不清楚。

pthread_mutex_t tmutex;

tmutex.lock();
process();
tmutex.unlock();

这种锁的话,是锁的process的入口吗?
如果process 内部还有process1 process2等的调用,
这个process1 和process2的调用不存在同步访问的问题是吧?
無名小伙 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

是否要加锁,得看操作的是否为同一对象
如果需要提高性能,考虑文件映射
[/Quote]
谢谢,没有共享对象,都是单个的串行操作,只是多线程调用此串行操作。
luciferisnotsatan 2011-10-31
  • 打赏
  • 举报
回复
无实际代码,不知道怎么改。

至于性能如何提高,先把锁加了,如果的确需要提升时再去想优化方法。
ouyh12345 2011-10-31
  • 打赏
  • 举报
回复
是否要加锁,得看操作的是否为同一对象
如果需要提高性能,考虑文件映射
疯魔症 2011-10-31
  • 打赏
  • 举报
回复
如果你的每个线程,有可能操作相同的文件,那么你的static方法是不安全的。
在操作文件时,加锁,调用上面的static方法,然后解锁。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧