专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

自个儿实现封装了一个锁机制,可以再linux,windows下使用,大家看看吧

发布时间:2011-06-28 12:16:59 文章来源:www.iduyao.cn 采编人员:星星草
自己实现封装了一个锁机制,可以再linux,windows下使用,大家看看吧
这段代码可以使用,大家看看有什么不足的地方吗?
.h文件

#ifndef __BSON_INFOSERVER_LOCKER_H__
#define __BSON_INFOSERVER_LOCKER_H__

#ifdef WIN32
#include <Windows.h>
#else
#include <pthread.h>
#endif

typedef class SimLock
{
private:

#ifdef WIN32
CRITICAL_SECTION win_critical_section;
#else
pthread_mutex_t linux_mutex;
#endif

public:
SimLock();
SimLock(const SimLock &other);
void lock();
void unlock();
virtual ~SimLock();

}LockType;

#endif //__BSON_INFOSERVER_LOCKER_H__


.cpp文件

#include "bson_infoserver_locker.h"

SimLock::SimLock()
{
#ifdef WIN32
InitializeCriticalSection(&win_critical_section);
#else
pthread_mutex_init(&linux_mutex, NULL);
#endif
}

SimLock::SimLock(const SimLock&other)
{
#ifdef WIN32
this->win_critical_section = other.win_critical_section;
InitializeCriticalSection(&(this->win_critical_section));
#else
this->linux_mutex = other.linux_mutex;
pthread_mutex_init(&(this->linux_mutex), NULL);
#endif
}

void SimLock::lock()
{
#ifdef WIN32
EnterCriticalSection(&win_critical_section);
#else
pthread_mutex_lock(&linux_mutex);
#endif
}

void SimLock::unlock()
{
#ifdef WIN32
LeaveCriticalSection(&win_critical_section);
#else
pthread_mutex_unlock(&linux_mutex);
#endif
}

SimLock::~SimLock()
{
#ifdef WIN32
DeleteCriticalSection(&win_critical_section);
#else
pthread_mutex_destroy(&linux_mutex);
#endif
}

------解决方案--------------------
仅供参考
#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 20000000
#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 WIN32
void Lock(CRITICAL_SECTION *l) {
    EnterCriticalSection(l);
}
void Unlock(CRITICAL_SECTION *l) {
    LeaveCriticalSection(l);
}
#else
void Lock(CRITICAL_SECTION *l) {
    pthread_mutex_lock(l);
}
void Unlock(CRITICAL_SECTION *l) {
    pthread_mutex_unlock(l);
}
#endif
void 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);
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: