2012-01-22 31 views
4

我写了一个多线程程序,其中三个线程试图将文本保存到同一个文件。我申请了关键部分。而在Windows 7下完美的作品,但在CE 6.0不同步,即,每个线程正试图在同一时间保存:为什么线程同步不起作用?

它现在的作品!感谢大家的帮助!

Emulator

Kernel tracker

关键部分:

InitializeCriticalSection(&CriticalSection); 

// Create worker threads 
for(i=0; i < THREADCOUNT; i++) 
{ 
    aThread[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) WriteToFile, NULL, 0, &ThreadID); 

    if(aThread[i] == NULL) 
    { 
     printf("CreateThread error: %d\n", GetLastError()); 
     return 1; 
    } 
} 

// Wait for all threads to terminate 
for(i=0; i < THREADCOUNT; i++) 
{ 
    WaitResult = WaitForSingleObject(aThread[i], INFINITE); 

    switch(WaitResult) 
    { 
     case WAIT_OBJECT_0: 
      printf("Thread %d has terminated...\n", i); 
     break; 

     // Time out 
     case WAIT_TIMEOUT: 
      printf("The waiting is timed out...\n"); 
      break; 

     // Return value is invalid. 
     default: 
      printf("Waiting failed, error %d...\n", GetLastError()); 
      ExitProcess(0); 
    } 
} 

// Close thread handles 
for(i=0; i < THREADCOUNT; i++) 
    CloseHandle(aThread[i]); 

// Release resources used by the critical section object. 
DeleteCriticalSection(&CriticalSection); 

功能由一个线程调用:

DWORD WINAPI WriteToFile(LPVOID lpParam) 
{ 
// lpParam not used in this example 
UNREFERENCED_PARAMETER(lpParam); 

DWORD dwCount=1, dwWaitResult; 

HANDLE hFile; 
char DataBuffer[30]; 
DWORD dwBytesToWrite; 
DWORD dwBytesWritten; 

// Request ownership of the critical section. 
EnterCriticalSection(&CriticalSection); 

    // Write to the file 
    printf("Thread %d writing to file...\n", GetCurrentThreadId()); 

    hFile = CreateFile(TEXT("file.txt"), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

    SetFilePointer(hFile, 0, NULL, FILE_END); 

    while(dwCount <= 3) 
    { 
     sprintf(DataBuffer, "Theard %d writing %d\n", GetCurrentThreadId(), dwCount); 
     dwBytesToWrite = (DWORD)strlen(DataBuffer); 

     WriteFile(hFile, DataBuffer, dwBytesToWrite, &dwBytesWritten, NULL); 

      printf("Theard %d wrote %d successfully.\n", GetCurrentThreadId(), dwCount); 
      } 
     } 

     dwCount++; 
    } 

CloseHandle(hFile);    

// Release ownership of the critical section. 
LeaveCriticalSection(&CriticalSection); 

return TRUE; 
} 
+0

你怎么初始化ghCriticalSection?请发布代码。谢谢! – hopia

+3

至少匈牙利语是错误的,InitializeCriticalSection需要一个指向CRITICAL_SECTION的指针,而不是指向句柄的指针。 –

+0

我有:CRITICAL_SECTION ghCriticalSection; –

回答

10

的问题是要传递TRUEfWaitAll标志为WaitForMultipleObjects。在Windows CE上,不支持:documentation on MSDN表示该标志必须是FALSEWaitForMultipleObjects因此不会等待,而是返回一个错误,但是您不检查返回码。因此主线程直通,关闭句柄并删除临界区,而“工作者”线程仍在运行。一旦DeleteCriticalSection被调用,临界区“不再能用于同步”,所以EnterCriticalSection电话可能不再块,和你结束了你这里的情况。

在Windows 7上,一切正常,因为WaitForMultipleObjects呼叫确实等待所有的线程完成。

比使用WaitForMultipleObjects相反,只需使用WaitForSingleObject在一个循环中等待依次在每个线程。

+0

宾果。他没有检查他的WaitForMultipleObjects的结果,这会告诉他有错误。在CE它可以等待任何,它不能等待所有。 – ctacke

+0

@Anthony:好抓! –