c++转移线程所有权

19 篇文章 0 订阅
6 篇文章 0 订阅

c++转移线程所有权

假设要写一个在后台启动线程的函数, 并想通过新线程返回的所有权去调用这个函数, 而不是等待线程结束再去调用;或者创建一个线程, 并在函数中转移所有权, 都必须要等待线程结束。 所以,新线程的所有权都需要转移 。这正是std::thread支持移动语义的原因。

c++标准库中含有不少资源占有类型,如std::ifstream、std::unique_ptr类、std::thread等都是可以移动但是不可复制的。因此对于一个具体的执行线程,其归属权可以在几个std::thread实例间转移。

void func1() {}
void func2() {}

int main()
{
    thread t1(func1);
    thread t2 = move(t1); // t1显示的将所有权交t2

    // 将一个临时对象所有权交给t1,不显示调用move()的原因是,
    // 所有者是一个临时对象,移动操作可以隐式进行。
    t1 = thread(func2);

    thread t3;

    t3 = move(t2);

    // 注意:这里t1已经有一个关联的线程,所以当执行到这里时,系统直接调用terminate()终止程序运行
    t1 = move(t3);
}

thread支持移动操作的意义是,函数可以便捷的向外部转移线程的归属权

thread f()
{
    void func1();
    return thread(func1);
}

thread g()
{
    void func2(int a);
    thread t(func2, 10);
    return t;
}

类似地,若归属权可以转移到函数内部,函数就能够接收thread实例作为按右值传递的参数

void f(thread t);

void g()
{
    void func1();
    f(thread(func1));
    
    thread t(func1);
    f(move(t));
} 
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,你可以使用Windows API提供的线程锁来实现线程同步。Windows提供了几种类型的线程锁,其中最常用的是互斥体(Mutex)和临界区(Critical Section)。 互斥体是一种二进制信号量,用于控制对共享资源的访问。当一个线程获得了互斥体的所有权后,其他线程就不能再访问该资源,直到该线程释放了互斥体。你可以使用以下函数来创建、锁定和释放互斥体: 1. `CreateMutex`: 创建一个互斥体对象。 2. `WaitForSingleObject`: 锁定互斥体对象。 3. `ReleaseMutex`: 释放互斥体对象。 临界区是一种更轻量级的线程锁,适用于同一进程内的线程同步。临界区的使用方法类似于互斥体,但临界区的性能比互斥体更好。你可以使用以下函数来创建、锁定和释放临界区: 1. `InitializeCriticalSection`: 初始化临界区对象。 2. `EnterCriticalSection`: 锁定临界区对象。 3. `LeaveCriticalSection`: 释放临界区对象。 下面是一个简单的示例,展示如何在Windows下使用互斥体来实现线程同步: ```cpp #include <windows.h> // 共享资源 int sharedData = 0; // 互斥体 HANDLE mutex; DWORD WINAPI ThreadFunc(LPVOID lpParam) { // 线程函数中使用互斥体进行线程同步 WaitForSingleObject(mutex, INFINITE); // 对共享资源进行操作 sharedData++; ReleaseMutex(mutex); return 0; } int main() { // 创建互斥体 mutex = CreateMutex(NULL, FALSE, NULL); // 创建线程 HANDLE thread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL); // 等待线程结束 WaitForSingleObject(thread, INFINITE); // 关闭句柄 CloseHandle(thread); CloseHandle(mutex); return 0; } ``` 在上面的示例中,我们使用互斥体来保护共享资源`sharedData`的访问。在主线程中创建了一个子线程,子线程对`sharedData`进行加一操作。通过互斥体的锁定和释放,确保了对`sharedData`的互斥访问。 希望以上信息能够帮助你理解在C++中使用Windows线程锁的方法。如果你有更多问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值