保证主线程和子线程执行过程是不受其他线程干扰的,因为里面涉及一些静态变量。
在主线程createmutex,waitfrosingalobject,主线程创建子线程,将mutex句柄传递给子线程,子线程中执行内部操作后,子线程releasemutex,句柄是同一个,但是releasemutex提示错误,子线程没有权限释放。
那有没有其他的线程同步方式,可以在不同的线程间使用一个互斥量?
9 个解决方案
#1
大牛在哪里?
#2
mutex的加锁和解锁都必须是同一个线程。
#3
跨线程???同步操作不本来就是多个线程之间的同步么???
为啥非得用mutex来进行同步呢?还有条件变量condition_variable!!
为啥非得用mutex来进行同步呢?还有条件变量condition_variable!!
#4
《Windows核心编程》
#5
互斥量本来就要在不同的线程中使用,否则还有什么意义
#6
互斥量本来就是在不同线程中公用,线程同步就是在不涉及同一内存资源写的情况下,都是各线程做各自内部事务的,但是涉及同一内存资源的写必须要加锁。这里的锁就是互斥量,信号量,事务对象,等等各种方式。原理都是一样,就是对同一时间的同一内存资源的唯一独占处理。
就像地铁上的座位,一个人(A线程)坐下了,其他人如果想坐这个座位(B线程)只能站着(等待)。这个座位你可以认为是互斥量。
座位空着就是可以被应用,可以被唯一独占,座位上有人就是不可以被应用,不可以占领。
就像地铁上的座位,一个人(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的所有权, 即使他是别的线程创建的.
以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
跨线程???同步操作不本来就是多个线程之间的同步么???
为啥非得用mutex来进行同步呢?还有条件变量condition_variable!!
为啥非得用mutex来进行同步呢?还有条件变量condition_variable!!
#4
《Windows核心编程》
#5
互斥量本来就要在不同的线程中使用,否则还有什么意义
#6
互斥量本来就是在不同线程中公用,线程同步就是在不涉及同一内存资源写的情况下,都是各线程做各自内部事务的,但是涉及同一内存资源的写必须要加锁。这里的锁就是互斥量,信号量,事务对象,等等各种方式。原理都是一样,就是对同一时间的同一内存资源的唯一独占处理。
就像地铁上的座位,一个人(A线程)坐下了,其他人如果想坐这个座位(B线程)只能站着(等待)。这个座位你可以认为是互斥量。
座位空着就是可以被应用,可以被唯一独占,座位上有人就是不可以被应用,不可以占领。
就像地铁上的座位,一个人(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的所有权, 即使他是别的线程创建的.
以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 更方便。