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

240 篇文章 2 订阅
在做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
......................

完美同步!
### 回答1: torch.cuda.synchronize是一个CUDA内核,用于等待当前GPU上的所有流完成。它通常用于确保所有的cuda流都已完成,或者在调用cuda内核之前确保所有的输入数据已经传输到GPU。 ### 回答2: torch.cuda.synchronize函数用于同步GPU计算和主机CPU之间的操作。 在深度学习,通常需要在GPU上进行大量的计算任务。由于GPU和CPU是分别独立的计算设备,在进行并行计算时可能会造成CPU和GPU之间的任务不同步。这就需要使用torch.cuda.synchronize函数来确保GPU计算完成后再进行CPU操作。 使用方法如下: 1. 在要同步的位置上调用torch.cuda.synchronize()函数,此函数没有参数。例如: ``` torch.cuda.synchronize() ``` 2. 在调用这个函数后,GPU上所有的计算任务将会被同步到CPU上。 在调用torch.cuda.synchronize()函数之前,可以先将需要同步的计算任务放入CUDA流,以便在GPU上异步运行。然后,在调用torch.cuda.synchronize()函数时,GPU会等待所有的计算任务完成后再继续。 同步操作可用于处理需要CPU和GPU数据交互的情况,如在训练过程进行梯度更新。 总而言之,torch.cuda.synchronize函数是用于同步CPU和GPU计算的工具,可以确保在进行下一步操作之前先等待GPU计算任务完成,以保证计算结果的正确性。 ### 回答3: torch.cuda.synchronize是PyTorch一个用于同步GPU操作的函数。在某些情况下,我们可能需要确保所有GPU操作都已经完成,才能继续进行后续的操作,这时就可以使用torch.cuda.synchronize函数。 该函数的使用方法如下: 1. 首先,需要先确定是否已经导入了torch.cuda模块。如果没有导入,需要使用torch.cuda.is_available()函数进行检查,并在返回True的情况下执行torch.cuda.init()来初始化CUDA环境。 2. 在需要同步GPU操作的位置,使用torch.cuda.synchronize()函数进行同步。此函数将会等待之前的所有GPU操作都完成后才会返回。可以在需要同步的操作之后再执行该函数。 下面是一个简单的示例: ```python import torch if torch.cuda.is_available(): torch.cuda.init() def some_gpu_operations(): # 在这里执行一些需要同步的GPU操作 pass if torch.cuda.is_available(): some_gpu_operations() torch.cuda.synchronize() # 同步GPU操作 # 继续进行后续的操作 ``` 在上述示例,首先检查是否可用CUDA,如果可用则初始化。然后执行一些需要同步的GPU操作,然后调用torch.cuda.synchronize()函数实现同步。之后可以继续进行后续的操作。 总之,torch.cuda.synchronize函数用于确保之前的GPU操作已经完成,可以在需要同步GPU操作的位置调用该函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值