避免加锁时 从用户态切换到内核态的消耗 使用原子操作来实现互斥性
std::atomic<StackNode*> base;
std::atomic<size_t> cursize;
Stack<int> is;
void push(const T& x)
{
StackNode* s=Buynode();
new(&(s->value)) T(x);
StackNode* p=base;
do
{
s->next=p;
}while(!base.compare_exchage_strong(p,s));
cursize+=1;
}
bool compare_exchage_strong(T& expected,T desired ) noexcept;
//原子的比较*this和expected的对象表示(c++20前)值表示(C++20起),而若它们逐位相等,则以desired替换前者(进行读修改写操作)。否则,将*this中的实际值加载进expected(进行加载操作)。
void funa()
{
is.push(12);
is.push(23);
}
void funb()
{
is.push(45);
is.push(56);
}
虚假唤醒
static int s=1;
static const int end=100;
int tag=1; //1 2 3
std::mutex mtx;
std::condition_variable cv;
void funa()
{
//1; begin+=1
}
void funb()
{
}
void func()
{
}
int main()
{
std::jthread tha(funa); //joinable
std::jthread thb(funb);
std::jthread thc(func);
}