`

(转)在C++中实现同步锁,类似synchronize(object){....}

    博客分类:
  • C++
阅读更多

在做C++的项目中发现,由于用惯了c#的lock(){}和java的Synchronize(){},windows自带的临界区,互斥量,内核事件,信号量用起来不太习惯,于是打算自己在vc++中封装一个类似的东东。封装这个我决定采用一个临界区来做,最终的形式如下:
synchronize(object)
{
//....无论此处是否发生异常,object都能被释放掉。和c#的lock一样。
}
不多说,开始代码。先定义一个Mutex类
class Mutex
{
public:
    Mutex(void);
    ~Mutex(void);
    void Lock();
    void UnLock();
private:
    CRITICAL_SECTION m_criticalSection;
};
实现如下

#include "Mutex.h"

Mutex::Mutex(void)
{
    InitializeCriticalSection(&m_criticalSection);
}

Mutex::~Mutex(void)
{
    DeleteCriticalSection(&m_criticalSection);//保证对象被析构时候能够删除临界区
}

void Mutex::Lock()
{
     EnterCriticalSection(&m_criticalSection);
}

void Mutex::UnLock()
{
    LeaveCriticalSection(&m_criticalSection);
}
在写一个Lock类来包装

//为了方便把头文件定义到了Mutex.h文件里面去了,修改Mutex.h如、//下:
#define synchronized(M)  for(Lock M##_lock = M; M##_lock; M##_lock.SetUnlock())//这句话后面会用到

class Mutex
{
public:
    Mutex(void);
    ~Mutex(void);
    void Lock();
    void UnLock();
private:
    CRITICAL_SECTION m_criticalSection;
};

class Lock
{
public:
    Lock(Mutex &mutex);
    ~Lock(void);
    void SetUnlock();
    operator bool () const;
private:
    Mutex &m_mutex;
    bool m_locked;
};
Lock类的实现:

#include "Mutex.h"

Lock::Lock(Mutex &mutex): m_mutex(mutex), m_locked(true)
{
    m_mutex.Lock();
}

Lock::~Lock(void)
{/*一定要在析构函数中解锁,因为不管发生什么,只要对象离开他的生命周期(即离开大括号),都会调用其析构函数*/
     m_mutex.UnLock();
}

void Lock::SetUnlock()
{
     m_locked = false;
}

Lock::operator bool() const
{
    return m_locked;
}
到这里算是基板上告一段落了,你可以这么用。
Mutex _mutex;
{
Lock lock(_mutex);
//...在这里同步
}
但还差一点点,我要的目标是synchronize(){.....}
简单!!!注意Mutex.h文件里面的宏,没错!就他了!!!
#define synchronized(M)  for(Lock M##_lock = M; M##_lock; M##_lock.SetUnlock())
大功告成!!!
来测试下

#include "Mutex.h"

Mutex mutex1;//我的互斥量
into thread_count = 0;
DWORD CALLBACK thread_proc(LPVOID params)
{
    for(int i = 0; i < 10; ++i)
    {
            synchronized(mutex1)//这里同步!
            {
                for(char c = 'A'; c <= 'Z'; ++c)
                {
                    printf("%c",c);
                    Sleep(2);
                }
                printf("\n");
            }
    }
    thread_count--;
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    thread_count = 4;
    CreateThread(0, 0, thread_proc, 0, 0, 0);
    CreateThread(0, 0, thread_proc, 0, 0, 0);
    CreateThread(0, 0, thread_proc, 0, 0, 0);
    CreateThread(0, 0, thread_proc, 0, 0, 0);
    while (thread_count)
        Sleep(0);
    getchar();
    DeleteCriticalSection(&g_cs);
    return 0;


输出:
ABCD...........Z
ABCD............Z
ABCD...........Z
ABCD............Z
ABCD...........Z
ABCD............Z
......................

分享到:
评论

相关推荐

    delphi vcl线程同步synchronize

    在Delphi中,线程同步可以通过各种技术实现,如:互斥量(Mutex)、信号量(Semaphore)、事件对象(Event)、线程同步对象(TThread.Synchronize)等。 ### 2. Synchronize方法 Synchronize方法是TThread类的一个...

    在C++Builer中多线程的实现.pdf

    在C++Builder中实现多线程是一项重要的技术,特别是在需要高效并发处理或实时性要求较高的应用程序中。C++Builder提供了一种便捷的方式来创建和管理线程,通过使用TThread类,使得多线程编程变得更加简单。 多线程...

    java synchronize 线程同步

    在引申的例子中,通过定义一个静态的`lock`对象,然后在同步代码块中使用它,确保了所有线程在执行`execute()`方法时都会获取这把全局锁,从而实现了同步。 ```java public class TestThread { private static ...

    FTP_synchronize_0_9_6_1_dll

    1. FTP_synchronize.dll:这是FTP同步插件的主要动态链接库文件。当你在Notepad++中安装这个插件时,需要将此文件复制到Notepad++的plugins目录下。该文件包含了实现FTP同步功能的所有必要代码,使得用户可以轻松...

    synchronize.pdf

    标题 "synchronize.pdf" 和描述 "synchronize详解" 显示该文档专注于Java编程语言中关键字 synchronized 的使用和机制。Synchronized 关键字是Java中用于控制多线程并发访问共享资源的一个核心关键字,确保同一时间...

    synchronize.zip

    在IT行业中,尤其是在Java编程领域,`synchronize.zip`这个文件名可能暗示着一个与同步相关的项目或代码库。从提供的文件列表来看,我们可以推测这是一个关于处理店铺操作任务的系统,比如更新店铺任务...

    Synchronize It 3.5文件夹同步器 简体中文界面

    专门用来比较和同步目录的程序,可用于源程序管理,如果比较的结果有不同的时候,可以用新的文件覆盖过旧的文件,达到同步更新的目的,也可以自己选择决定是否更新。Synchronize It!还有其他特点如下: 1.可以自订...

    C++Builder多线程编程技术.pdf

    在C++Builder中实现生产者-消费者问题,可以通过TThread类创建生产者和消费者线程,并利用同步对象(如TEvent或TMutex)来控制对缓冲区的访问。生产者在放入数据后通知消费者,消费者在取走数据后通知生产者,这样便...

    禁止VMware虚拟机与Host的时间同步.pdf

    例如,tools.syncTime配置项决定了虚拟机是否与宿主机同步时间,time.synchronize.continue配置项决定了虚拟机在拍摄快照后是否同步时间,等等。 禁止VMware虚拟机与Host的时间同步可以通过多种方法实现,包括关闭...

    实现VisualSVN Server主从同步备份.pdf

    VisualSVN Server主从同步备份是通过在主服务器和从服务器之间同步备份提交的版本数据,以实现数据的双备份,防止数据丢失。这种备份方式适用于两个主机或者一个本地和远程之间的数据备份。 知识点二:VisualSVN ...

    精彩编程与编程技巧-在VB6.0中使ACCESS数据库在网络使用中保持同步...

    ### 在VB6.0中使ACCESS数据库在网络使用中保持同步:深入解析与实践 #### 核心知识点概览 在企业级应用开发中,数据库同步是确保数据一致性和可用性的关键环节,尤其在网络环境中,多用户同时访问同一数据库时更是...

    MFC中同步操作的实现

    即使在一个线程内,CWinThread的成员函数如Synchronize可以用来在主线程中安全地执行回调函数,保证了回调函数在主线程的上下文中运行,从而实现同步。 此外,MFC的CSingleLock和CMultiLock类提供了锁机制,用于...

    Tricks of the Windows video Game Programming---part1

    Perform AI and Game Logic ..........................................17 Section 5: Render Next Frame ........................................................18 Section 6: Synchronize Display .......

    Synchronize和ReentrantLock区别.png

    Synchronize(同步锁)和ReentrantLock(可重入锁)都是Java中的常用锁,都是用来保证线程安全的。两者都是同步锁,且都是阻塞同步。阻塞同步:当一个线程获取锁后,其他线程只能等待(进入阻塞态),等待获取锁的...

    C++Builder线程.pdf

    在实现生产者-消费者问题时,通常会使用线程同步对象,如信号量(Semaphore)、互斥量(Mutex)或事件对象(Event)。这些对象允许线程间进行通信,控制对共享资源的访问。例如,当缓冲区满时,生产者线程会被阻塞,...

    Eclipse权威开发指南2.pdf

    7.4.1 怎样把扩展显示在用户界面中,显示在哪里..... 186 7.4.2 扩展用户界面的常用方法.... 186 7.4.3 用户界面的扩展怎样感知某些事件(如用户的选择)?..... 189 7.4.4 怎样扩展对象(如显示在Outline视图中的...

    C++简单多线程

    在C++编程中,多线程是一个重要的概念,它允许程序同时执行多个任务,从而提高效率和性能。尤其是在GUI(图形用户界面)应用程序中,多线程技术常常用于分离用户界面更新与后台处理,以避免界面卡顿。C++ Builder是...

    c++builder 用png 图片做的窗体背景半透明 加入动画效果

    9. **多线程与同步**:如果动画效果涉及到复杂的计算或需要提高性能,可能需要在后台线程中处理,然后使用同步机制(如`Synchronize`函数)更新UI。 10. **调试与优化**:在开发过程中,使用C++Builder的调试工具...

    精彩编程与编程技巧-利用VB使ACCESS数据库在网络使用中保持同步...

    ### 知识点一:利用VB实现ACCESS数据库网络同步 #### 核心概念解析 - **VB(Visual Basic)**:一种由微软开发的事件驱动的编程语言,它具有友好的用户界面,易于学习和使用,非常适合进行快速应用程序开发。 - **...

Global site tag (gtag.js) - Google Analytics