多线程问题处理。请教 现有一程序。 程序运行时动态创建多个线程。几个线程同时对某一目录下的文件进行操作。操作完毕后对文件进行删除。问题是怎么能保证最后一个对文件操作完毕的线程对文件进行删除。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在创建线程时记录一个计数为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);} 加一个全局静态变量记录线程数static i=0,创建时i+1;推出时-1, 线程间是需要同步的,最好是用WaitForMultipleObjects 我现在的处理办法是:一个变量delcount,统计线程执行删除操作的次数。另外写了一个函数统计工作线程的个数。if(--){ 可以删除; delcount ++; if(删除操作的次数==工作线程的个数) { 删除; } delcount = 0;//重新赋值} if(可以删除){ 删除操作的次数 ++; if(删除操作的次数==工作线程的个数) { 删除; delcount = 0;//重新赋值 } }如果有多个文件同时发到目录下的话,回出现问题。 HANDLE hThreadA[2]; //这是两个线程的句柄主线程退出时加以下代码WaitForMultipleObjects(2, hThreadA,TRUE, INFINITE);另外注意两个工作线程不要用SendMessage向主线程发消息,MFC有很多函数是这么干的 线程同步例子:// 临界区结构对象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);} CRITICAL_SECTION应该是保护线程操作的吧?好象不太合适。 to,,,回复人: gonch(gongch) 我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。 to,,,回复人: gonch(gongch) 我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。每个连接都要发数据。 还是更改一下实现机制好一些,再加一个线程读取文件,读完之后删掉。将读取的内容保存到内存中,然后每个线程将内存中的内容发送出去。同时计数,当全部线程都发送过去之后再将这段内存清掉/////////////////////////////////////////////to,,,回复人: gonch(gongch)再加一个线程读取文件,读完之后删掉。将读取的内容保存到内存中, 请问由谁来释放内存呢? 释放内存时还是遇到同样的问题.. 在新的线程里面加计数器,读取文件之后设为N(N是socket链接的个数),发送成功则计数器减1。当N==0的时候删除文件。注意对计数器操作要加锁 可以加入一个数组结构f[n],f里面为CString filename,int count两个变量。当有一个文件拷贝到目录里时,线程读文件,并在f中搜索有没有纪录,没有则添加新纪录,有则count+1.如果count=线程数目,则删除该文件,记录。 关于openCV不同版本出现的问题 CDateTimeCtrl更改文字颜色问题 关于内联汇编的问题(已经想了一晚) 高分,有关CSplitterWnd 高手帮忙!关于对话框问题 谁能详细的说一下这句话的意思?"CChatRecordSet cs(&::ChatDB);" 急!!在线请教串口通信方面的问题!(利用串口将音乐从电脑下载到手机上面)!100分!! winSocket问题 100分重金悬赏:如何做出像Acrobat Reader那样的字体圆滑显示效果? 找VC高手,专兼职均可 如何只处理avi的视频部分? nlame.dll这个DLL怎么用啊?谁能给我一个VC调用的例子吗?
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);
}
if(--)
{
可以删除;
delcount ++;
if(删除操作的次数==工作线程的个数)
{
删除;
}
delcount = 0;//重新赋值
}
{
删除操作的次数 ++;
if(删除操作的次数==工作线程的个数)
{
删除;
delcount = 0;//重新赋值
}
}
如果有多个文件同时发到目录下的话,回出现问题。
主线程退出时加以下代码
WaitForMultipleObjects(2, hThreadA,TRUE, INFINITE);
另外注意两个工作线程不要用SendMessage向主线程发消息,MFC有很多函数是这么干的
// 临界区结构对象
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);
}
我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。
我的程序是对物理隔离外的发数据,发完后删除,每一个socket连接为一个线程。每个连接都要发数据。
将读取的内容保存到内存中,然后每个线程将内存中的内容发送出去。
同时计数,当全部线程都发送过去之后再将这段内存清掉
/////////////////////////////////////////////
to,,,回复人: gonch(gongch)
再加一个线程读取文件,读完之后删掉。将读取的内容保存到内存中,
请问由谁来释放内存呢? 释放内存时还是遇到同样的问题..
当有一个文件拷贝到目录里时,线程读文件,并在f中搜索有没有纪录,没有则添加新纪录,有则count+1.如果count=线程数目,则删除该文件,记录。