关于多线程公用一个对象的问题

argue2000 2009-04-29 06:01:36
SegWord coc = new SegWord();
StreamReader sr = new StreamReader(new FileStream(Util.GetDataPath("seg\\" + strFile), FileMode.Open), Encoding.Default);
StreamWriter sw = new StreamWriter(new FileStream(Util.GetDataPath("seg\\" + strFile + ".seg"), FileMode.Create), Encoding.Default);
string strLine = "";
int i = 1;
while ((strLine = sr.ReadLine()) != null)
{
strLine = strLine.Trim();
if ((i % iLineNum == 2) || (i % iLineNum == 3) || (i % iLineNum == 4))
{
sw.WriteLine(coc.Seg(strLine, bFilter, iType, segType) );
}
else
{
sw.WriteLine(strLine);
}
i++;
}
sr.Close();
sw.Close();
=====================================================================================================
只调用seg函数处理 2 3 4 行,
处理小规模文本,一小时只能处理700兆左右,想改成多线程的,对这个不熟,网上搜了搜。
有几个疑问:

我想开多线程,一个线程读文件,开十个线程切分文本,但是需要定义对象SegWord coc = new SegWord(),利用coc.Seg()函数来切分文本,我这十个线程都调用这个函数的话,是不是这个对象我要定义十个?还是可以对象复用,但是那样进程间互相切换,是不是开销很大?

因为之前没有接触过多线程,现在很茫然,读取线程将文件传输给切分线程,十个线程切分文件中不同的行,这十个线程之间的临界资源会不会冲突?如何协调这十个线程之间的关系。

是不是再开一个线程写文件更好?
大家有什么好的思路没?
...全文
231 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
argue2000 2009-04-30
  • 打赏
  • 举报
回复
我还是没把问题描述清楚。下面是我要处理的文件形式,六行是一个单位,处理这个每六行的第2 3 4 行,既没有数字id的行。
如果不同线程从不同的文件偏移指针开始读一定数据,我怕读乱了。所以才想开一个线程专门读文件。
处理完后的文件,按照顺序重新保存到一个文件中。

163189:2:0:0.0
古天乐寻秦记36

电视 古天乐寻秦记36 - 大家肯定都知道了,我就不多说了哈 寻秦记 ,电视
5
2666
163188:2:0:0.0
古天乐寻秦记25

电视 古天乐寻秦记25 - 大家肯定都知道了,我就不多说了哈 寻秦记 古天乐 电视 ,电视
5
2649
huofen2005 2009-04-29
  • 打赏
  • 举报
回复
我说说我的设计:

创建四种任务:(1).载入和调度 (2)处理 (3)回写
都写成死循环处理任务队列的形式。

载入和调度过程:
(1)文件标记:每个文件一进入处理,就分配一个ID进行标识,同时创建对应的控制段,搞个全局vector ok了。
(2)文件切片.这个切片最好按照你文件的特性来,你要6行6行处理,那么就可以假设为600行一片。把分片相关信息记录在对应的控制段中(分片数量,各片缓冲区指针,处理状态等等),同时每个片记住对应控制段指针和本片ID(自己是哪一片)。
(3)调度,找一个闲着的或者排队最短的处理任务,把分片发给他处理。

处理过程:
(1)死循环一个,如果自己的任务队列为空,那就sleep(10);如果自己任务队列有任务,那就处理。
(2)处理好之后,更新控制段(注意互斥),如果发现该文件所有片都齐了,那么找一个闲着的或者排队最短的回写任务,通知其处理哪个文件。

回写:
接到命令,检验OK,把文件拼接起来,写回硬盘。


流水线形式处理,根据实际应用,找出瓶颈在哪里环节?然后瓶颈处多开几个任务即可。甚至可以搞个全局监控,把各环节的线程数做成根据当前等待队列动态调节。
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 argue2000 的回复:]
我的意思是,能不能用一个线程读文件,读出来的传递给两外专门用于切分文件的线程去处理?
引用 5 楼 hairetz 的回复:
引用 3 楼 argue2000 的回复:
引用 1 楼 hairetz 的回复:
你自己确定文件整体大概多大。然后不同线程从不同的文件偏移指针开始读一定数据。

如果是多线程排队对文件,我感觉对效率没什么提高。


一个线程读文件,其他线程排队处理文件内容怎么样?
要是切开文件,我怕切错了

因为文件是…
[/Quote]

可以,线程可以共享该进程的全局变量,你可以申请全局变量来存储文件内容,虽然不知道你为何要这么做。
argue2000 2009-04-29
  • 打赏
  • 举报
回复
对十个线程没有共同改变的资源,但是需要将数据存放到一个资源中,这就需要考虑同步了
[Quote=引用 2 楼 pathuang68 的回复:]
1. 文件可以分成10等份
2. 开10格线程
3. 每个线程读其中一等份,10个线程可以同时读(假定文件可以共享读,即无读锁)
4. 根据你给出的业务实例,线程之间无须同步,因为他们没有改变共同的资源(即你所读的文件)
5. 如果10个线程要将分别读取的数据存放到同一个资源中(如一个文件),那就需要考虑同步问题
[/Quote]
argue2000 2009-04-29
  • 打赏
  • 举报
回复
我的意思是,能不能用一个线程读文件,读出来的传递给两外专门用于切分文件的线程去处理?
[Quote=引用 5 楼 hairetz 的回复:]
引用 3 楼 argue2000 的回复:
引用 1 楼 hairetz 的回复:
你自己确定文件整体大概多大。然后不同线程从不同的文件偏移指针开始读一定数据。

如果是多线程排队对文件,我感觉对效率没什么提高。


一个线程读文件,其他线程排队处理文件内容怎么样?
要是切开文件,我怕切错了

因为文件是以6行为一个单位的,我只处理这六行的第2 3 4 行


那你不偏移文件指针,你想怎么读?读线程轮着读?用一个互斥锁来控…
[/Quote]
argue2000 2009-04-29
  • 打赏
  • 举报
回复
明白了,我把文件切分成开成十份,然后十个线程分别从不同的地方开始,每个线程定义一个SegWord对象,这样去切分文本。就是SegWord对象太大,保存的都是一些字典信息。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 argue2000 的回复:]
引用 1 楼 hairetz 的回复:
你自己确定文件整体大概多大。然后不同线程从不同的文件偏移指针开始读一定数据。

如果是多线程排队对文件,我感觉对效率没什么提高。


一个线程读文件,其他线程排队处理文件内容怎么样?
要是切开文件,我怕切错了

因为文件是以6行为一个单位的,我只处理这六行的第2 3 4 行
[/Quote]

那你不偏移文件指针,你想怎么读?读线程轮着读?用一个互斥锁来控制线程读取同步。这样效率有提高么?

多线程的例子,网上很多啊,你随便下个看下,基本就是创建线程的时候启动线程函数,你在线程函数里尝试打开文件,并读取就是了。
argue2000 2009-04-29
  • 打赏
  • 举报
回复
得考虑同步,因为要存到一个文件中

[Quote=引用 2 楼 pathuang68 的回复:]
1. 文件可以分成10等份
2. 开10格线程
3. 每个线程读其中一等份,10个线程可以同时读(假定文件可以共享读,即无读锁)
4. 根据你给出的业务实例,线程之间无须同步,因为他们没有改变共同的资源(即你所读的文件)
5. 如果10个线程要将分别读取的数据存放到同一个资源中(如一个文件),那就需要考虑同步问题
[/Quote]
argue2000 2009-04-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hairetz 的回复:]
你自己确定文件整体大概多大。然后不同线程从不同的文件偏移指针开始读一定数据。

如果是多线程排队对文件,我感觉对效率没什么提高。
[/Quote]

一个线程读文件,其他线程排队处理文件内容怎么样?
要是切开文件,我怕切错了

因为文件是以6行为一个单位的,我只处理这六行的第2 3 4 行
pathuang68 2009-04-29
  • 打赏
  • 举报
回复
1. 文件可以分成10等份
2. 开10格线程
3. 每个线程读其中一等份,10个线程可以同时读(假定文件可以共享读,即无读锁)
4. 根据你给出的业务实例,线程之间无须同步,因为他们没有改变共同的资源(即你所读的文件)
5. 如果10个线程要将分别读取的数据存放到同一个资源中(如一个文件),那就需要考虑同步问题
  • 打赏
  • 举报
回复
你自己确定文件整体大概多大。然后不同线程从不同的文件偏移指针开始读一定数据。

如果是多线程排队对文件,我感觉对效率没什么提高。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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