C/C++はどのように自分で1つの反発ロックを実現して、教授はあなたを楽に面接に混ぜます!

2508 ワード

変態の会社があるそうですが、面接問題はあなた自身が反発ロックを実現することです.
理屈を言うとこのテーマは変態で、反発ロックというものは聞くととても底がついていて、アセンブリ命令を使わないと全然できないような気がします.
しかし、問題はアセンブリ言語に慣れていないことです.私たちの世界の転行プログラマーとして、c言語、c++文法を理解するのは容易ではありません.アセンブリ言語は無理に理解してもいいです.
あきらめることにしたが、突然c++標準にstd::atomicというテンプレートクラスがあることに気づいた.瞬時に思うと、実際には言語で提供される他の特性を使って、アセンブリで実現されることを避けることができます.
反発ロックの真髄は原子操作にあり,c++標準ライブラリには原子操作を実現するクラスが適切にいくつか提供されている.これらのクラスはちょうど反発ロックを実現するのに役立ちます.
反発ロックの鍵は、フラグ変数の読み取りと書き込みを原子操作に統合することであり、検索すると、std::atomic_flagは要求に完全に合致している.だから実現はそれに頼っている.
コードを直接与えて、これは教授ロックのヘッダファイルで、STLのように設計して、includeは使うことができます.(jiaoshouLock.h)
#ifndef JIAOSHOULOCK
#define JIAOSHOULOCK

#include 

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       
#include          
#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点を打つ!