多线程问题处理。请教
现有一程序。 程序运行时动态创建多个线程。几个线程同时对某一目录下的文件进行操作。操作完毕后对文件进行删除。问题是怎么能保证最后一个对文件操作完毕的线程对文件进行删除。 问题点数:100、回复次数:31Top
1 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-07-11 19:57:09 得分 10
判断其他线程还存活,没有了的话就删除?Top
2 楼tanyaliji(努力学习.net)(★)回复于 2005-07-11 19:59:34 得分 0
线程一直是活着的。比如有2个线程,两个线程一直在工作检测该目录下是否有文件。有则对其进行相关操作。操作完毕后删除文件。Top
3 楼tanyaliji(努力学习.net)(★)回复于 2005-07-11 20:25:06 得分 0
fen不够再加。Top
4 楼qrlvls( 空 气 )回复于 2005-07-11 20:37:04 得分 30
在创建线程时记录一个计数为2,在线程退出时通过互斥操作分别将该计数一1,如果结果为0则删除文件
int g_nValue = 2;
CRITICAL_SECTION g_sCrit;
{
InitializeCriticalSection(&g_sCrit);
...
hThread1 = AfxBeginThread(..., ThreadProc, ...
hThread2 = AfxBeginThread(..., ThreadPorc, ...
...
}
static DWORD WINAPI ThreadProc(LPVOID pParam)
{
...
EnterCriticalSection(&g_sCrit);
g_nValue --;
if (g_nValue <= 0)
DeleteFile(...
LeaveCriticalSection(&g_sCrit);
if (g_nValue <= 0)
DeleteCriticalSection(&g_sCrit);
}Top
5 楼jiangsheng(蒋晟.Net[MVP])回复于 2005-07-12 02:30:31 得分 0
你可以尝试把文件进行改名,改名成功则可以删除,失败则说明尚在使用Top
6 楼caucyniu(caucy)回复于 2005-07-12 09:16:26 得分 0
加一个全局静态变量记录线程数static i=0,创建时i+1;推出时-1,Top
7 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-07-12 09:32:15 得分 0
主线程等待最后一个线程操作完毕后再退出Top
8 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2005-07-12 10:53:28 得分 0
线程间是需要同步的,最好是用WaitForMultipleObjectsTop
9 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 15:41:12 得分 0
谢谢楼上的大侠。问题是线程一直在工作。比如有2个线程,两个线程一直在工作检测该目录下是否有文件。有则对其进行相关操作,操作完毕后删除文件。有没有线程同步的例子?Top
10 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 15:47:38 得分 0
我现在的处理办法是:一个变量delcount,统计线程执行删除操作的次数。另外写了一个函数统计工作线程的个数。
if(--)
{
可以删除;
delcount ++;
if(删除操作的次数==工作线程的个数)
{
删除;
}
delcount = 0;//重新赋值
}
Top
11 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 15:53:36 得分 0
if(可以删除)
{
删除操作的次数 ++;
if(删除操作的次数==工作线程的个数)
{
删除;
delcount = 0;//重新赋值
}
}
如果有多个文件同时发到目录下的话,回出现问题。Top
12 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-07-12 15:59:52 得分 20
HANDLE hThreadA[2]; //这是两个线程的句柄
主线程退出时加以下代码
WaitForMultipleObjects(2, hThreadA,TRUE, INFINITE);
另外注意两个工作线程不要用SendMessage向主线程发消息,MFC有很多函数是这么干的Top
13 楼oyljerry(【勇敢的心】→ ㊣提拉米苏√㊣)回复于 2005-07-12 18:23:31 得分 10
可以用事件来控制线程操作流程Top
14 楼tanyaliji(努力学习.net)(★)回复于 2005-07-12 22:07:02 得分 0
有没有线程同步的例子?
Top
15 楼caucyniu(caucy)回复于 2005-07-13 09:05:40 得分 20
线程同步例子:
// 临界区结构对象
CRITICAL_SECTION g_cs;
// 共享资源
char g_cArray[10];
UINT ThreadProc10(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[i] = ’a’;
Sleep(1);
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return 0;
}
UINT ThreadProc11(LPVOID pParam)
{
// 进入临界区
EnterCriticalSection(&g_cs);
// 对共享资源进行写入操作
for (int i = 0; i < 10; i++)
{
g_cArray[10 - i - 1] = ’b’;
Sleep(1);
}
// 离开临界区
LeaveCriticalSection(&g_cs);
return 0;
}
……
void CSample08View::OnCriticalSection()
{
// 初始化临界区
InitializeCriticalSection(&g_cs);
// 启动线程
AfxBeginThread(ThreadProc10, NULL);
AfxBeginThread(ThreadProc11, NULL);
// 等待计算完毕
Sleep(300);
// 报告计算结果
CString sResult = CString(g_cArray);
AfxMessageBox(sResult);
}Top
16 楼tanyaliji(努力学习.net)(★)回复于 2005-07-13 09:26:20 得分 0
CRITICAL_SECTION应该是保护线程操作的吧?好象不太合适。Top
17 楼gonch(gongch)回复于 2005-07-13 15:28:46 得分 0
觉得实现的机制有问题,为什么用多个线程对同一个文件作类似的操作?完全可以用单一的线程来完成这件事情的。Top
18 楼tanyaliji(努力学习.net)(★)回复于 2005-07-13 18:59:45 得分 0
to,,,回复人: gonch(gongch)
我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。Top
19 楼tanyaliji(努力学习.net)(★)回复于 2005-07-13 19:31:33 得分 0
to,,,回复人: gonch(gongch)
我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。每个连接都要发数据。Top
20 楼tanyaliji(努力学习.net)(★)回复于 2005-07-14 19:21:38 得分 0
搞定了,
结帐啦。!Top
21 楼gonch(gongch)回复于 2005-07-15 09:22:06 得分 10
还是更改一下实现机制好一些,再加一个线程读取文件,读完之后删掉。
将读取的内容保存到内存中,然后每个线程将内存中的内容发送出去。
同时计数,当全部线程都发送过去之后再将这段内存清掉Top
22 楼tanyaliji(努力学习.net)(★)回复于 2005-07-15 13:14:51 得分 0
还是更改一下实现机制好一些,再加一个线程读取文件,读完之后删掉。
将读取的内容保存到内存中,然后每个线程将内存中的内容发送出去。
同时计数,当全部线程都发送过去之后再将这段内存清掉
/////////////////////////////////////////////
to,,,回复人: gonch(gongch)
再加一个线程读取文件,读完之后删掉。将读取的内容保存到内存中,
请问由谁来释放内存呢? 释放内存时还是遇到同样的问题..Top
23 楼gonch(gongch)回复于 2005-07-18 08:37:03 得分 0
在新的线程里面加计数器,读取文件之后设为N(N是socket链接的个数),发送成功则计数器减1。当N==0的时候删除文件。注意对计数器操作要加锁Top
24 楼tanyaliji(努力学习.net)(★)回复于 2005-07-26 20:28:56 得分 0
如果同时有两个文件拷贝到目录下还是有问题的。Top
25 楼gonch(gongch)回复于 2005-07-27 14:36:25 得分 0
只有一个线程在读文件,怎么会有问题?!
没有明白你的意思,问题出在什么地方?!Top
26 楼tanyaliji(努力学习.net)(★)回复于 2005-07-27 20:10:58 得分 0
多个线程在读.Top
27 楼dirdirdir3(风)回复于 2005-07-28 09:42:16 得分 0
可以加入一个数组结构f[n],f里面为CString filename,int count两个变量。
当有一个文件拷贝到目录里时,线程读文件,并在f中搜索有没有纪录,没有则添加新纪录,有则count+1.如果count=线程数目,则删除该文件,记录。Top
28 楼gonch(gongch)回复于 2005-07-28 11:09:17 得分 0
多线程在读的话,只能加文件锁或者临界区来互斥了Top
29 楼snakebite2008(3DFX)回复于 2005-07-28 17:18:33 得分 0
我写了一个和楼主差不多的程序,不过我是把收到的数据存到数据库里。Top
30 楼tanyaliji(努力学习.net)(★)回复于 2005-07-28 20:52:28 得分 0
楼上的怎么处理的?Top
31 楼tanyaliji(努力学习.net)(★)回复于 2005-08-02 21:03:17 得分 0
结贴。Top




