当前位置: 代码迷 >> 多核软件开发 >> 多线程同步有关问题(新手请问)
  详细解决方案

多线程同步有关问题(新手请问)

热度:2987   发布时间:2013-02-26 00:00:00.0
多线程同步问题(新手请教) - C/C++ / C++ 语言
各位大虾帮忙看下,为什么在我的电脑上运行的结果全是thread1 sells ...啊?为甚么thread2没有得到运行呢?
我的电脑i5处理器,2G内存, 谢谢!
C/C++ code
#include <iostream>#include <windows.h>using namespace std;DWORD WINAPI FunProc1(LPVOID lpParameter);DWORD WINAPI FunProc2(LPVOID lpParameter);int tickets = 100;CRITICAL_SECTION g_cs;int main(){    HANDLE hThread1, hThread2;    hThread1 = ::CreateThread(NULL, 0, FunProc1, NULL, 0, NULL);    hThread2 = ::CreateThread(NULL, 0, FunProc2, NULL, 0, NULL);    //递减线程内核对象的计数    ::CloseHandle(hThread1);    ::CloseHandle(hThread2);    ::InitializeCriticalSection(&g_cs);    ::Sleep(5000);    ::DeleteCriticalSection(&g_cs);    return 0;}DWORD WINAPI FunProc1(LPVOID lpParameter){    while(true)    {        ::EnterCriticalSection(&g_cs);        ::Sleep(1);        if(tickets > 0)        {            ::Sleep(1);            cout << "thread1 sells ticket: " << tickets-- << endl;            ::LeaveCriticalSection(&g_cs);        }        else        {            ::LeaveCriticalSection(&g_cs);            break;        }    }    return 0;}DWORD WINAPI FunProc2(LPVOID lpParameter){    while(true)    {        ::EnterCriticalSection(&g_cs);        ::Sleep(1);        if(tickets > 0)        {            ::Sleep(1);            cout << "thread1 sells ticket: " << tickets-- << endl;            ::LeaveCriticalSection(&g_cs);        }        else        {            ::LeaveCriticalSection(&g_cs);            break;        }    }    return 0;}


------解决方案--------------------------------------------------------
仅供调试多线程的程序用
C/C++ code
#include <stdio.h>#include <stdlib.h>#include <string.h>#ifdef WIN32    #include <windows.h>    #include <io.h>#else    #include <unistd.h>    #include <sys/time.h>    #include <pthread.h>    #define  CRITICAL_SECTION   pthread_mutex_t    #define  _vsnprintf         vsnprintf#endif//Log{#define MAXLOGSIZE 100000000#define ARRSIZE(x) (sizeof(x)/sizeof(x[0]))#include <time.h>#include <sys/timeb.h>#include <stdarg.h>char logfilename1[]="MyLog1.log";char logfilename2[]="MyLog2.log";char logstr[16000];char datestr[16];char timestr[16];char mss[4];CRITICAL_SECTION cs_log;FILE *flog;#ifdef WIN32void Lock(CRITICAL_SECTION *l) {    EnterCriticalSection(l);}void Unlock(CRITICAL_SECTION *l) {    LeaveCriticalSection(l);}#elsevoid Lock(CRITICAL_SECTION *l) {    pthread_mutex_lock(l);}void Unlock(CRITICAL_SECTION *l) {    pthread_mutex_unlock(l);}#endifvoid LogV(const char *pszFmt,va_list argp) {    struct tm *now;    struct timeb tb;    if (NULL==pszFmt||0==pszFmt[0]) return;    if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;    ftime(&tb);    now=localtime(&tb.time);    sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);    sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );    sprintf(mss,"%03d",tb.millitm);    printf("%s %s.%s %s",datestr,timestr,mss,logstr);    flog=fopen(logfilename1,"a");    if (NULL!=flog) {        fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);        if (ftell(flog)>MAXLOGSIZE) {            fclose(flog);            if (rename(logfilename1,logfilename2)) {                remove(logfilename2);                rename(logfilename1,logfilename2);            }            flog=fopen(logfilename1,"a");            if (NULL==flog) return;        }        fclose(flog);    }}void Log(const char *pszFmt,...) {    va_list argp;    Lock(&cs_log);    va_start(argp,pszFmt);    LogV(pszFmt,argp);    va_end(argp);    Unlock(&cs_log);}//Log}int main(int argc,char * argv[]) {    int i;#ifdef WIN32    InitializeCriticalSection(&cs_log);#else    pthread_mutex_init(&cs_log,NULL);#endif    for (i=0;i<10000;i++) {        Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);    }#ifdef WIN32    DeleteCriticalSection(&cs_log);#else    pthread_mutex_destroy(&cs_log);#endif    return 0;}
  相关解决方案