首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

求信号量怎么使用

2012-02-20 
求信号量如何使用 - C++ Builder / Windows SDK/API求代码[解决办法]MSDN就有Examples啊,我帮你摘录过来:C

求信号量如何使用 - C++ Builder / Windows SDK/API
求代码

[解决办法]
MSDN就有Examples啊,我帮你摘录过来:

C/C++ code
#include <windows.h>#include <stdio.h>#define MAX_SEM_COUNT 10#define THREADCOUNT 12HANDLE ghSemaphore;DWORD WINAPI ThreadProc( LPVOID );void main(){    HANDLE aThread[THREADCOUNT];    DWORD ThreadID;    int i;    // Create a semaphore with initial and max counts of MAX_SEM_COUNT    ghSemaphore = CreateSemaphore(         NULL,           // default security attributes        MAX_SEM_COUNT,  // initial count        MAX_SEM_COUNT,  // maximum count        NULL);          // unnamed semaphore    if (ghSemaphore == NULL)     {        printf("CreateSemaphore error: %d\n", GetLastError());        return;    }    // Create worker threads    for( i=0; i < THREADCOUNT; i++ )    {        aThread[i] = CreateThread(                      NULL,       // default security attributes                     0,          // default stack size                     (LPTHREAD_START_ROUTINE) ThreadProc,                      NULL,       // no thread function arguments                     0,          // default creation flags                     &ThreadID); // receive thread identifier        if( aThread[i] == NULL )        {            printf("CreateThread error: %d\n", GetLastError());            return;        }    }    // Wait for all threads to terminate    WaitForMultipleObjects(THREADCOUNT, aThread, TRUE, INFINITE);    // Close thread and semaphore handles    for( i=0; i < THREADCOUNT; i++ )        CloseHandle(aThread[i]);    CloseHandle(ghSemaphore);}DWORD WINAPI ThreadProc( LPVOID lpParam ){    DWORD dwWaitResult;     BOOL bContinue=TRUE;    while(bContinue)    {        // Try to enter the semaphore gate.        dwWaitResult = WaitForSingleObject(             ghSemaphore,   // handle to semaphore            0L);           // zero-second time-out interval        switch (dwWaitResult)         {             // The semaphore object was signaled.            case WAIT_OBJECT_0:                 // TODO: Perform task                printf("Thread %d: wait succeeded\n", GetCurrentThreadId());                bContinue=FALSE;                            // Simulate thread spending time on task                Sleep(5);                // Release the semaphore when task is finished                if (!ReleaseSemaphore(                         ghSemaphore,  // handle to semaphore                        1,            // increase count by one                        NULL) )       // not interested in previous count                {                    printf("ReleaseSemaphore error: %d\n", GetLastError());                }                break;             // The semaphore was nonsignaled, so a time-out occurred.            case WAIT_TIMEOUT:                 printf("Thread %d: wait timed out\n", GetCurrentThreadId());                break;         }    }    return TRUE;}
[解决办法]
http://zhidao.baidu.com/question/41134806.html?fr=ala0

热点排行