c++ fork進程與同步鎖


首先定義在多進程環境中的鎖,采用讀寫鎖,即可以同時讀,但只能單獨寫。

頭文件processLock.h

#ifndef PROCESSLOCK_H
#define PROCESSLOCK_H

#include <pthread.h>
#include <dlfcn.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <cstring>

class ProcessLock {
  private:
    pthread_rwlock_t _lock;
    pthread_rwlockattr_t _attr;
    ProcessLock();
    void init();
    static ProcessLock* processLock;
  public:
    int read();
    int write();
    int unlock();
    static ProcessLock* createLock();
    ~ProcessLock();
};

#endif

源文件processLock.cpp

#include "processLock.h"

ProcessLock* ProcessLock::processLock = NULL;

void ProcessLock::init() {
//初始化讀寫鎖的屬性為進程共享,並與讀寫鎖關聯起來。 pthread_rwlockattr_init(
&_attr); pthread_rwlockattr_setpshared(&_attr, PTHREAD_PROCESS_SHARED); pthread_rwlock_init(&_lock, &_attr); } int ProcessLock::read() { return pthread_rwlock_rdlock(&_lock); } int ProcessLock::write() { return pthread_rwlock_wrlock(&_lock); }

int ProcessLock::unlock() {
return pthread_rwlock_unlock(&_lock);
} ProcessLock
* ProcessLock::createLock() {
//采用mmap實現指針的進程共享,這樣在后續獲取鎖的時候,就是進程間共享的鎖。
if (prorcessLock == NULL) { processLock = (ProcessLock)mmap(NULL, sizeof(ProcessLock), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0); processLock->init(); } return processLock; } ProcessLock::~ProcessLock() { pthread_rwlock_destroy(&_lock); pthread_rwlockattr_destroy(&_attr); }

實際應用:

#include "processLock.h"

int main() {
  //child process read, main process write
  ProcessLock* lock = ProcessLock::createLock();
  pid_t fpid = fork();
  if (fpid < 0) {
    cout << "fork error!" << endl;
    exit(1);
  } else if (fpid == 0) {
    cout << "child process" << endl;
    lock->read();
    //do read something
    lock->unlock();
  } else {
    cout << "parent process" << endl;
    lock->write();
    //do write something
    lock->unlock();
  }
  return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM