Category 最新活动

1、什么是互斥锁?

互斥锁是(Mutex)是一种用于多线程编程的同步原语,用于确保在多个线程访问共享资源时的互斥性。

在多线程环境中,当多个线程同时访问共享资源时,可能会导致数据的竞争和不一致问题。为了避免这种问题,需要确保在任何时候只有一个线程能够访问共享资源,而其他线程需要等待直到资源可用。

互斥锁提供这样一种机制,即在某个线程访问共享资源时,它会有互斥锁,其他线程需要等待互斥锁的释放才能访问共享资源。一旦线程完成对共享资源的访问,它会释放互斥锁,以便其他线程可以获取互斥锁并访问共享资源。

2、互斥锁的基本操作包括两个重要的步骤:加锁和解锁

加锁(Lock):当一个线程需要访问共享资源时,它会尝试获取互斥锁。如果互斥锁当前没有被其他线程持有,那么该线程就能够获取互斥锁,继续执行访问共享资源的代码。如果互斥锁已经被其他线程持有,那么该线程会进入堵塞状态,等待互斥锁的释放。

解锁(Unlock):当一个线程完成对共享资源的访问时,它会释放互斥锁,以便其他线程可以获取互斥锁并访问共享资源。

3、示例代码

main.cpp

#include

#include

#include

std::mutex mtx;

int sharedResource = 0;

void increment()

{

for (int i=0; i<5; ++i){

std::lock_guard lock(mtx); // 使用 std::lock_guard 创建互斥锁的作用域,确保每次只有一个线程可以访问 sharedResource

sharedResource++;

std::cout << "Increatmented, value: " << sharedResource << std::endl;

} // 在作用域结束时,std::lock_guard 会自动释放互斥锁

}

void decrement()

{

for (int i=0; i< 5; ++i){

std::lock_guard lock(mtx);

sharedResource--;

std::cout << "Decremented, value: " << sharedResource << std::endl;

}

}

int main()

{

// 创建了两个线程 t1 和 t2

std::thread t1(increment);

std::thread t2(decrement);

// 等待这两个线程的执行结束

t1.join();

t2.join();

std::cout << "Final shared resource value: " << sharedResource << std::endl;

return 0;

}

CmakeList.txt

cmake_minimum_required(VERSION 3.5)

project(untitled2 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)

set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Threads REQUIRED)

add_executable(untitled2 main.cpp)

#include(GNUInstallDirs)

#install(TARGETS untitled2

# LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}

# RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}

#)

target_link_libraries(untitled2 Threads::Threads)

程序输出

23:12:22: Starting /home/lrj/build-untitled2-Desktop_Qt_5_15_2_GCC_64bit-Debug/untitled2...

Increatmented, value: 1

Increatmented, value: 2

Increatmented, value: 3

Increatmented, value: 4

Increatmented, value: 5

Decremented, value: 4

Decremented, value: 3

Decremented, value: 2

Decremented, value: 1

Decremented, value: 0

Final shared resource value: 0

23:12:22: /home/lrj/build-untitled2-Desktop_Qt_5_15_2_GCC_64bit-Debug/untitled2 退出,退出代码: 0

由输出信息可见,increament对共享资源访问的时候,decrement是堵塞的。

top
Copyright © 2088 《王者新服》限时活动专题站 All Rights Reserved.
友情链接