2 xlxulin1 xlxulin1 于 2015.06.10 17:17 提问

关于多线程mutex 或者锁的问题

Object1 a;
Object2 b;
Object3 c;

handle mutexa;
handle mutexb;
handle mutexc;
handle mutexd;

void threadfunction1()
{
mutexa.acquire();
op(a); // 对对象a的读写操作
mutexa.release();

 mutexb.acquire();
 op(b);  // 对对象b的读写操作
 mutexb.release();

 commonFun();

}

void threadfucntion2()
{
mutexa.acquire();
op(a); // 对对象a的读写操作
mutexa.release();

 mutexd.acquire();  // 这里用的是 mutexd,跟threadfun1不同
 op(b);  // 对对象b的读写操作
 mutexd.release();

commonFun();

}

void commonFun()
{
mutex.acquire();
printf(“1111111\n”);
printf(“2222222\n”);
printf(“3333333\n”);
printf(“4444444\n”);
op(c); // 对对象c的读写操作
mutex.release();
}

void main()
{
thread1; // 调用的是function1;
thread2; // 调用的是function1;
.
.
thread50; // 调用的是function1;

    //-------------
    thread51;  // 调用的是function2;
thread52; // 调用的是function2;
    .
    .
    thread100;  // 调用的是function2;
start();

}

以上的这段代码,关于对象b,是否成功被保护了?
问题2. 每个进程中访问临界资源的那段代码称为临界区(Critical Section),根据临界区的概念,commonfun 属于临界区,还有哪些代码是临界区?
问题3.commonfun中的输出语句 会是
1111
2222
3333
4444
1111
2222
3333
4444

还是 会出现乱序情况
1111
1111
2222
3333
3333

1个回答

Tiger_Zhao
Tiger_Zhao   Rxr 2015.06.11 10:13
已采纳

1、没有。用的不是同一个mutex。
2、完全不是一个概念:临界区(Critical section)与互斥体(Mutex)的区别
3、应该是有序的。不过你用的是哪个 mutext?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C++11多线程互斥锁的使用
#include #include #include #include #include #include #include // 参考:http://www.cnblogs.com/haippy/p/3284540.html namespace thread_lock { std::mutex g_io_mutex; //------------------------
lock Mutex Monitor 之间的区别与详解, .net 多线程 同步异步操作,锁
Framework为我们提供了三个加锁的机制,分别是Monitor类、Lock关 键字和Mutex类。   总体而言,lock和monitor可以锁定对象,也可以锁定函数;而mutex一般用于锁定函数,并保证不同线程间同步调用函数,而不会受线程优先级影响。使用lock和monitor对象锁定对象时(即在对象外部锁定,或者在对象中的函数被调用的地方锁定对象),可以保证该对象一次只被一个线程
C++11多线程之mutex等锁机制和atomic原子操作对比
一.简介这里以mutex锁机制为例. mutex函数:是一套专门用于线程同步锁机制的函数. #include <mutex> using namespace std;atomic原子操作:是在新标准C++11,引入了原子操作的概念,并通过这个新的头文件提供了多种原子操作数据类型,例如,atomic_bool,atomic_int等等. #include <atomic>
线程、同步与锁——Mutex想说爱你不容易
除了Lock()、Monitor之外,我们最长用的就是Mutex了,但是玩不好Mutex就总会造成死锁或者AbandonedMutexException(我就玩的不怎么好,在并发性访问测试的时候总是遇到关于Mutex的问题,各位线虫见笑了,不过还是把我遇到的一些问题和总结拿出来和大家分享,有误的地方还往指正。 还是先举一个简单的例子,来说明一下这个东西:    public c
Linux多线程编程-互斥锁
互斥锁         多线程编程中,(多线程编程)可以用互斥锁(也称互斥量)可以用来保护关键代码段,以确保其独占式的访问,这有点像二进制信号量。POSIX互斥锁相关函数主要有以下5个: #include int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); int pthr
Windows线程同步之互斥锁(Mutex)
线程同步的方式和机制 临界区、互斥区、事件、信号量四种方式 临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)的区别 1、临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线
一次Mutex死锁的原因探究
1、现象 最近项目中调出一个bug,某些时候程序会卡死不动,用windbg进行加载后用 ~*kb 命令列出所有的线程栈调用,发现有多个线程调用 WaitForMultipleObjects 在等待同一个内核对象:
C++11 多线程同步 互斥锁 条件变量
在多线程程序中,线程同步(多个线程访问一个资源保证顺序)是一个非常重要的问题,Linux下常见的线程同步的方法有下面几种: 互斥锁 条件变量 信号量 这篇博客只介绍互斥量和条件变量的使用。互斥锁和条件变量通常情况下,互斥锁和条件变量是配合使用的,互斥锁用于短期锁定,主要保证线程对临界区的进入;条件变量用于线程长期等待,在wait的时候会释放锁。操作的API如下所示(介绍最常用的): std::m
关于互斥锁的死锁及解决措施
死锁:1、什么是死锁:     一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起等待别的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁,因此就永远处于挂起等待状态了,这叫做死锁(Deadlock)。     另一种:若线程A获得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程B释放锁2,而这时线...
linux 多线程详解(互斥、信号、条件cond、锁)
文章链接地址: http://docs.oracle.com/cd/E19253-01/819-7051/sync-83092/index.html Documentation Home  > 多线程编程指南  > 第 4 章 用同步对象编程 多线程编程指南 Previous: 第 3 章 线程属性Next: 第 5 章