C++有没有跨线程 同步操作

时间:2021-12-14 23:51:02
请问mutex的创建和释放好像只能在同一个线程中,我想在一个主线程中创建mutex,在子线程是释放,有没有可以用的线程同步机制?
保证主线程和子线程执行过程是不受其他线程干扰的,因为里面涉及一些静态变量。
在主线程createmutex,waitfrosingalobject,主线程创建子线程,将mutex句柄传递给子线程,子线程中执行内部操作后,子线程releasemutex,句柄是同一个,但是releasemutex提示错误,子线程没有权限释放。

那有没有其他的线程同步方式,可以在不同的线程间使用一个互斥量?

9 个解决方案

#1


大牛在哪里?

#2


mutex的加锁和解锁都必须是同一个线程。

#3


跨线程???同步操作不本来就是多个线程之间的同步么??? C++有没有跨线程 同步操作

为啥非得用mutex来进行同步呢?还有条件变量condition_variable!! C++有没有跨线程 同步操作

#4


《Windows核心编程》

#5


互斥量本来就要在不同的线程中使用,否则还有什么意义

#6


互斥量本来就是在不同线程中公用,线程同步就是在不涉及同一内存资源写的情况下,都是各线程做各自内部事务的,但是涉及同一内存资源的写必须要加锁。这里的锁就是互斥量,信号量,事务对象,等等各种方式。原理都是一样,就是对同一时间的同一内存资源的唯一独占处理。

就像地铁上的座位,一个人(A线程)坐下了,其他人如果想坐这个座位(B线程)只能站着(等待)。这个座位你可以认为是互斥量。
座位空着就是可以被应用,可以被唯一独占,座位上有人就是不可以被应用,不可以占领。

#7


亲 是这个样子的
以Win32为例

::ReleaseMutex()这个东西要想调用成功, 前提之一一定是当前线程拿到了mutex的控制权(不一定要创建mutex)
msdn有云:
The ReleaseMutex function fails if the calling thread does not own the mutex object. 

换句话说 谁拥有, 谁释放
你在主线程中
::CreateMutex(NULL,  true, "mutex")

然后创建了新的线程A, 在A中上来直接调用::ReleaseMutex()是不行的
因为你A线程尝试释放其他线程拥有的mutex

但是呢 如果
你在主线程中
::CreateMutex(NULL,  false, "mutex")

然后创建了新的线程A, 在A中上
{
// lock
WaitForSingleObject();

// TODO......
xxoo......

// unlock
::ReleaseMutex();
}
这样是可以释放的的, 因为线程A获取到了mutex的所有权, 即使他是别的线程创建的.

#8


C++11,貌似对多线程包装的很好,可以看看相关例子

#9


mutex 和 condition variable 就行啊。类型要是很简单直接用 atomic 更方便。

#1


大牛在哪里?

#2


mutex的加锁和解锁都必须是同一个线程。

#3


跨线程???同步操作不本来就是多个线程之间的同步么??? C++有没有跨线程 同步操作

为啥非得用mutex来进行同步呢?还有条件变量condition_variable!! C++有没有跨线程 同步操作

#4


《Windows核心编程》

#5


互斥量本来就要在不同的线程中使用,否则还有什么意义

#6


互斥量本来就是在不同线程中公用,线程同步就是在不涉及同一内存资源写的情况下,都是各线程做各自内部事务的,但是涉及同一内存资源的写必须要加锁。这里的锁就是互斥量,信号量,事务对象,等等各种方式。原理都是一样,就是对同一时间的同一内存资源的唯一独占处理。

就像地铁上的座位,一个人(A线程)坐下了,其他人如果想坐这个座位(B线程)只能站着(等待)。这个座位你可以认为是互斥量。
座位空着就是可以被应用,可以被唯一独占,座位上有人就是不可以被应用,不可以占领。

#7


亲 是这个样子的
以Win32为例

::ReleaseMutex()这个东西要想调用成功, 前提之一一定是当前线程拿到了mutex的控制权(不一定要创建mutex)
msdn有云:
The ReleaseMutex function fails if the calling thread does not own the mutex object. 

换句话说 谁拥有, 谁释放
你在主线程中
::CreateMutex(NULL,  true, "mutex")

然后创建了新的线程A, 在A中上来直接调用::ReleaseMutex()是不行的
因为你A线程尝试释放其他线程拥有的mutex

但是呢 如果
你在主线程中
::CreateMutex(NULL,  false, "mutex")

然后创建了新的线程A, 在A中上
{
// lock
WaitForSingleObject();

// TODO......
xxoo......

// unlock
::ReleaseMutex();
}
这样是可以释放的的, 因为线程A获取到了mutex的所有权, 即使他是别的线程创建的.

#8


C++11,貌似对多线程包装的很好,可以看看相关例子

#9


mutex 和 condition variable 就行啊。类型要是很简单直接用 atomic 更方便。