保护共享数据并共享同一堆栈的解决方法可以使用线程锁(mutex)来实现。下面是一个使用C++的代码示例:
#include
#include
#include
#include
std::mutex mtx;
std::stack sharedStack;
void pushToStack(int value) {
std::lock_guard lock(mtx); // 获取锁
sharedStack.push(value);
std::cout << "Pushed " << value << " to stack" << std::endl;
}
void popFromStack() {
std::lock_guard lock(mtx); // 获取锁
if (!sharedStack.empty()) {
int value = sharedStack.top();
sharedStack.pop();
std::cout << "Popped " << value << " from stack" << std::endl;
}
}
int main() {
std::thread t1(pushToStack, 1);
std::thread t2(pushToStack, 2);
std::thread t3(popFromStack);
std::thread t4(popFromStack);
t1.join();
t2.join();
t3.join();
t4.join();
return 0;
}
在上面的示例中,我们使用了std::mutex
来创建一个互斥量,并使用std::lock_guard
来自动获取和释放锁,确保在访问共享数据之前获取锁,并在访问完成后释放锁。
pushToStack
函数用于将值推入共享栈中,它首先获取锁,然后将值推入栈中,并打印相关信息。
popFromStack
函数用于从共享栈中弹出值,它首先获取锁,然后检查栈是否为空,如果不为空,则弹出栈顶的值,并打印相关信息。
在main
函数中,我们创建了四个线程,其中两个线程负责将值推入栈中,另外两个线程负责从栈中弹出值。通过使用互斥量,我们确保了在访问共享数据(栈)时,每次只能有一个线程进行操作,从而保护了共享数据的一致性。
上一篇:保护公共联系表单的API端点
下一篇:保护工作表但仍允许调整列宽