欢迎访问宙启技术站
智能推送

[Linux线程]线程的同步--使用互斥锁完成线程同步

发布时间:2023-05-15 18:35:23

线程同步是指多个线程之间的协作,保证数据的一致性和完整性。在多线程的应用中,由于线程之间共享同一数据空间,每个线程访问该数据空间的顺序和时间都不同,因此就可能发生资源竞争的情况,例如一个线程正在修改共享数据,而另一个线程正在读取该数据,就会导致数据不一致的情况。为了避免这种情况的发生,需要使用同步机制。

互斥锁是一种同步机制,它通过将共享数据的访问进行加锁和解锁来保证同一时间只有一个线程能够访问共享数据,从而避免了资源竞争的情况。

下面我们来看一下如何使用互斥锁来完成线程同步:

1. 定义互斥锁

在程序中定义一个pthread_mutex_t类型的变量来表示互斥锁,然后对该变量进行初始化,可以使用pthread_mutex_init函数来完成对互斥锁的初始化。

2. 加锁

在需要访问共享数据的代码段前加锁,可以使用pthread_mutex_lock函数来加锁。

3. 解锁

在共享数据的访问结束后解锁,可以使用pthread_mutex_unlock函数来解锁。

下面是一个使用互斥锁来完成线程同步的示例程序:

#include <pthread.h>
#include <stdio.h>

#define NUM_THREADS 5

pthread_mutex_t mutex;
int sum = 0;

void *thread_func(void *arg)
{
    int i;
    for (i = 0; i < 10; i++) {
        pthread_mutex_lock(&mutex);
        sum++;
        pthread_mutex_unlock(&mutex);
        printf("Thread %d: sum = %d
", (int)arg, sum);
    }
    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    pthread_t threads[NUM_THREADS];
    int i, rc;

    // 初始化互斥锁
    rc = pthread_mutex_init(&mutex, NULL);
    if (rc != 0) {
        printf("Failed to initialize mutex.
");
        return -1;
    }

    // 创建多个线程
    for (i = 0; i < NUM_THREADS; i++) {
        rc = pthread_create(&threads[i], NULL, thread_func, (void*)i);
        if (rc != 0) {
            printf("Failed to create thread.
");
            return -1;
        }
    }

    // 等待所有线程结束
    for (i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }

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

    return 0;
}

在上面的程序中,我们定义了一个int类型的全局变量sum,并在thread_func函数中对其进行累加操作,同时使用互斥锁来使得每次只有一个线程能够访问该变量。在主函数中创建了多个线程来执行thread_func函数,并等待所有线程执行结束后输出最终的sum值。最后使用pthread_mutex_destroy函数销毁互斥锁。

总结

使用互斥锁可以有效避免多线程之间的资源竞争,保证数据的一致性和完整性。当多个线程需要访问共享数据时应该使用互斥锁来进行同步。在使用互斥锁时要注意加锁和解锁的位置,以避免死锁的情况发生。