C++多线程之——pthread_mutex_t

目录

pthread_mutex_t

pthread_mutex_t 是 POSIX(Portable Operating System Interface)线程库中的数据类型,通常简称为 Pthreads。它提供了一种标准化的方式,用于多线程程序同步访问共享资源,以防止数据损坏和竞争条件。

pthread_mutex_t 实际上是一个互斥锁(mutex)对象。它用于创建和管理多线程程序中的互斥锁。互斥锁是同步原语,允许多个线程协调工作,确保在任何时刻只有一个线程可以访问关键代码段或共享资源。这可以防止在多个线程同时尝试访问相同资源时发生冲突和数据损坏。

以下是与 pthread_mutex_t 相关的一些关键操作和函数:

  1. 初始化 :通常使用 pthread_mutex_init 函数来初始化 pthread_mutex_t

  2. 加锁 :线程可以使用 pthread_mutex_lock 来获取互斥锁。如果互斥锁已经被另一个线程锁定,调用线程将会阻塞,直到互斥锁变为可用。

  3. 解锁 :线程使用 pthread_mutex_unlock 来释放互斥锁,允许其他线程获取锁。

  4. 尝试加锁pthread_mutex_trylockpthread_mutex_lock 的非阻塞替代方法。它尝试获取互斥锁,如果互斥锁已经被另一个线程锁定,它会立即返回一个错误代码,而不会阻塞。

  5. 销毁 :当您不再需要一个 pthread_mutex_t 时,应该销毁它,通常使用 pthread_mutex_destroy 函数来完成。

互斥锁是多线程编程中常用的工具,用于确保共享资源的安全访问。通过适当地使用互斥锁,可以避免竞争条件和数据损坏问题,从而编写可靠的多线程程序。

让我们通过一个简单的示例来演示如何使用 pthread_mutex_t 和相关函数来实现多线程同步。在这个示例中,我们将创建两个线程,它们将同时递增一个共享计数器,但由于使用了互斥锁,我们可以确保同时只有一个线程能够修改计数器的值。

cpp 复制代码
#include <stdio.h>
#include <pthread.h>

// 定义一个共享计数器
int counter = 0;

// 定义互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 线程函数,将计数器递增 10000 次
void *thread_function(void *arg) {
    for (int i = 0; i < 10000; i++) {
        // 加锁
        pthread_mutex_lock(&mutex);

        // 访问共享资源(计数器)
        counter++;

        // 解锁
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main() {
    // 创建两个线程
    pthread_t thread1, thread2;

    // 启动线程1
    pthread_create(&thread1, NULL, thread_function, NULL);

    // 启动线程2
    pthread_create(&thread2, NULL, thread_function, NULL);

    // 等待线程1和线程2完成
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    // 打印最终的计数器值
    printf("Final Counter Value: %d\n", counter);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    return 0;
}

在这个示例中,我们创建了两个线程 thread1 和 thread2,它们同时递增共享的计数器 counter。由于我们在访问共享资源之前使用了 pthread_mutex_lock 来锁定互斥锁,在访问完成后使用 pthread_mutex_unlock 来解锁,因此可以确保只有一个线程能够修改计数器的值,从而避免了竞争条件。最终,计数器的值将是 20000,因为两个线程各自递增了 10000 次。

pthread_create

pthread_create 函数是 POSIX 线程库中用于创建新线程的函数。它的主要作用是在一个多线程的程序中创建一个新的线程,该线程将在指定的函数中开始执行。以下是 pthread_create 函数的基本用法和参数解释:

c 复制代码
int pthread_create(
    pthread_t *thread,              // 用于存储新线程的标识符
    const pthread_attr_t *attr,     // 线程的属性,通常为 NULL,表示使用默认属性
    void *(*start_routine)(void *), // 新线程将执行的函数指针
    void *arg                        // 传递给新线程函数的参数
);

参数说明:

  • thread: 一个指向 pthread_t 类型的指针,用于存储新线程的标识符。通过这个标识符,你可以对新线程进行操作,如等待它的完成或取消它。

  • attr: 一个指向 pthread_attr_t 类型的指针,表示线程的属性。通常情况下,可以将其设置为 NULL,表示使用默认属性。如果需要设置线程的特殊属性,可以创建一个 pthread_attr_t 对象并配置相应的属性,然后将其传递给 pthread_create

  • start_routine: 一个函数指针,指向新线程将要执行的函数。这个函数必须接受一个 void* 类型的参数,并返回一个 void* 类型的指针。新线程将从这个函数开始执行。

  • arg: 一个 void* 类型的参数,用于传递给 start_routine 函数。这是一个指向任何类型的指针,允许你向新线程传递任何需要的数据。

pthread_create 函数成功创建新线程时,会将新线程的标识符存储在 thread 指针所指向的位置,并开始执行 start_routine 函数,同时将 arg 参数传递给 start_routine

下面是一个简单的示例,演示了如何使用 pthread_create 来创建一个新线程:

c 复制代码
#include <stdio.h>
#include <pthread.h>

void *thread_function(void *arg) {
    printf("Hello from the new thread!\n");
    return NULL;
}

int main() {
    pthread_t my_thread;

    // 创建新线程并启动它执行 thread_function 函数
    pthread_create(&my_thread, NULL, thread_function, NULL);

    // 等待新线程完成
    pthread_join(my_thread, NULL);

    printf("Main thread: New thread has finished.\n");
    return 0;
}

在这个示例中,pthread_create 创建了一个新线程,新线程执行 thread_function 函数,而主线程等待新线程的完成。当新线程执行完毕后,主线程会继续执行。

相关推荐
StrokeAce42 分钟前
linux桌面软件(wps)内嵌到主窗口后的关闭问题
linux·c++·qt·wps·窗口内嵌
一颗花生米。2 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼2 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
学习使我快乐012 小时前
JS进阶 3——深入面向对象、原型
开发语言·前端·javascript
通信仿真实验室3 小时前
(10)MATLAB莱斯(Rician)衰落信道仿真1
开发语言·matlab
勿语&3 小时前
Element-UI Plus 暗黑主题切换及自定义主题色
开发语言·javascript·ui
家有狸花4 小时前
VSCODE驯服日记(三):配置C++环境
c++·ide·vscode
dengqingrui1234 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝4 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树