C/C++ 怎么样自己实现一个互斥锁, 教授帮你轻松混面试!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sxpcccc/article/details/89316975

据说有一些变态的公司,面试题是要你自己实现一个互斥锁。

讲道理这个题目还是蛮变态的,互斥锁这玩意一听就非常底层,感觉不用汇编指令那套东西完全是办不到的。

但问题是汇编语言我不熟悉啊。作为码农界的转行程序员,能把c语言,c++语法搞明白就很不容易了,汇编语言勉强看懂还行,要求精通,只能QNMB。

本来已经决定放弃,突然发现c++标准中还有 std::atomic 这么个模板类。瞬间想到,其实还是可以用语言提供的另外一些特性,来规避掉被迫用汇编实现。

互斥锁的精髓在于原子操作,c++标准库中恰好提供了一些实现原子操作的类。这些类正好帮你来实现互斥锁。

互斥锁关键在于要把标志变量的读和写综合到一个原子操作中,一阵搜索,发现这么个类 std::atomic_flag 完全符合要求。所以实现就靠它了。

直接给出代码,这是个教授锁的头文件,设计成STL那样,include就能用。(jiaoshouLock.h)

#ifndef JIAOSHOULOCK
#define JIAOSHOULOCK

#include <atomic>

class jiaoshouLock{

private:

std::atomic_flag alock = ATOMIC_FLAG_INIT;

public:

void lock(){
while(true == alock.test_and_set()){}
}

void unlock(){
alock.clear();
}

};

#endif

再写个小程序试用一下jiaoshouLock (lockThread.cpp)

#include <iostream>      
#include <thread>         
#include "jiaoshouLock.h"

jiaoshouLock mylock;
 
void foo(int *x) 
{
  while(*x<100)
  {
    mylock.lock();
    std::cout <<  "foo: " << *x << std::endl;
    ++(*x);
    mylock.unlock();
  }
}

void bar(int *x)
{
  while(*x<100)
  {
    mylock.lock();
    std::cout << "bar: " << *x << std::endl;
    ++(*x);
    mylock.unlock();
  }
}

int main() 
{
  
  int i = 0;
  
  std::thread first (foo,&i);     
  std::thread second (bar,&i);  



  first.join();                
  second.join();               



  return 0;
}

编译运行一下,看一看结果

foo: 0
bar: 1
foo: 2
bar: 3
foo: 4
bar: 5
foo: 6
bar: 7
foo: 8
bar: 9
foo: 10
bar: 11
foo: 12
bar: 13
foo: 14
bar: 15
foo: 16
bar: 17
bar: 18
foo: 19
bar: 20
foo: 21
bar: 22
foo: 23
bar: 24
foo: 25
bar: 26
foo: 27
bar: 28
bar: 29
foo: 30
bar: 31
foo: 32
bar: 33
foo: 34
bar: 35
bar: 36
foo: 37
bar: 38
foo: 39
bar: 40
bar: 41
bar: 42
bar: 43
foo: 44
bar: 45
foo: 46
bar: 47
foo: 48
bar: 49
foo: 50
bar: 51
bar: 52
foo: 53
bar: 54
foo: 55
bar: 56
bar: 57
foo: 58
bar: 59
foo: 60
bar: 61
bar: 62
foo: 63
bar: 64
foo: 65
bar: 66
foo: 67
bar: 68
foo: 69
bar: 70
bar: 71
foo: 72
bar: 73
bar: 74
foo: 75
bar: 76
foo: 77
bar: 78
foo: 79
bar: 80
foo: 81
bar: 82
foo: 83
bar: 84
foo: 85
bar: 86
foo: 87
bar: 88
foo: 89
bar: 90
foo: 91
bar: 92
foo: 93
bar: 94
foo: 95
bar: 96
foo: 97
bar: 98
foo: 99
bar: 100

颇费!完美绕过了所有难点!我打100分!

展开阅读全文

没有更多推荐了,返回首页