一、单例模式、多线程之间的资源锁用法
test.h
#include <string> #include <pthread.h> using namespace std; class Test { protected: pthread_rwlockattr_t _rwaddr; pthread_rwlock_t _rwlock; protected: void rlock(){ pthread_rwlock_rdlock(&_rwlock); } //多线程里互斥量读的时候要加该锁 void wlock(){ pthread_rwlock_wrlock(&_rwlock); } //多线程里互斥量写的时候要加该锁 void unlock(){ pthread_rwlock_unlock(&_rwlock); } //解锁 private: Test(void); ~Test(void); static Test * _cm; public: static Test* getInstance(); }; #endif
#include "test.h" Test *Test::_cm = NULL; Test *Test::getInstance() { if(NULL == _cm){ _cm = new Test(); } return _cm; } Test::Test() { pthread_rwlockattr_init(&_rwaddr); pthread_rwlock_init(&_rwlock, &_rwaddr); } Test::~Test() { pthread_rwlock_destroy(&_rwlock); pthread_rwlockattr_destroy(&_rwaddr); }
二、程序运行参数
#include <getopt.h> void GetOpt(int argc, char** argv, string& setupFilePath) { if(argc<2) { cout<<"usage:-v for modul version!\n -s for confPath!"<<endl; exit(-1); } const char * const short_options = "vs:"; const struct option long_options[] = {{ "version", 0, NULL, 'v' },{ "setup", 1, NULL, 's' },{ NULL, 0, NULL, 0 }}; int next_option; do{ next_option = getopt_long (argc, argv, short_options, long_options, NULL); switch( next_option ) { case 'v': /* -h or --help */ cout<<_VERSION_<<endl; exit(0); break; case 's': /* -s or --setup */ setupFilePath = optarg; break; case -1: /* Done with options. */ break; default: /* Something else: unexpected. */ exit(1); break; } }while( next_option != -1 ); }如:
>test -v 可以查看程序版本号
>test -s test.conf 利用配置文件test.conf来运行程序等
三、捕捉kill消息
#include <getopt.h> void sigRoutine(int sig) { switch(sig) { case SIGUSR2: //-12 { dosomething(); break; } case SIGUSR1: //-10 { cout<<"safe exit."; exit(0); break; } default: break; } } int main(int argc, char **argv) { ... signal(SIGUSR1,sigRoutine); signal(SIGUSR2,sigRoutine); signal(SIGPIPE,SIG_IGN); //捕捉PIPE信号,防止向已关闭的连接中写数据时导致直接退出程序的情况。 ... return 0; }
如:
>kill -10 ID 程序安全退出