Linux多线程及线程同步简单实例

本文介绍了多线程的基本概念及其在实际应用中的重要性,并通过实例详细讲解了如何使用互斥锁和条件变量实现线程间的同步,确保线程安全地访问共享资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、多线程基本概念

1. 线程的基本概念

① 线程就是轻量级的进程

②线程和创建他的进程共享代码段、数据段

③线程拥有自己的栈

2. 在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入互斥机制,而互斥锁(mutex)是互斥机制中的一种

3. 简单实例

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

pthread_t work1Id;
pthread_t work2Id;

int work1Ret = 1;
int work2Ret = 2;

pthread_mutex_t mutex;

int number = 0;

void* Work1(void* args)
{
    int i = 0;
    
    printf("I am work%d\n", *((int*)args));
    
    for(i = 0; i < 10; i++)
    {
        pthread_mutex_lock(&mutex);
        number++;
        pthread_mutex_unlock(&mutex);
        
        printf("I am work%d, number = %d\n", *((int*)args), number);
        
        sleep(1);
    }
    
    return &work1Ret;
}

void* Work2(void* args)
{
    int i = 0;
    
    printf("I am work%d\n", *((int*)args));
    
    for(i = 0; i < 10; i++)
    {
        pthread_mutex_lock(&mutex);
        number++;
        pthread_mutex_unlock(&mutex);
        
        printf("I am work%d, number = %d\n", *((int*)args), number);
        
        sleep(1);
    }
    
    return &work2Ret;
}

int main()
{
    int args1 = 1;
    int args2 = 2;
    
    void* work1Ret = NULL;
    void* work2Ret = NULL; 
    
    pthread_mutex_init(&mutex, NULL);
    
    pthread_create(&work1Id, NULL, Work1, &args1);
    
    pthread_create(&work2Id, NULL, Work2, &args2);
    
    pthread_join(work1Id, &work1Ret);
    
    if(work1Ret != NULL)
    {
        printf("work1Ret = %d\n", *((int*)work1Ret));
    }
    
    pthread_join(work2Id, &work2Ret);
    
    if(work2Ret != NULL)
    {
        printf("work2Ret = %d\n", *((int*)work2Ret));
    }
    
    return 0;
}

 

二、线程同步

1. 多个线程按照规定的顺序来执行,即为线程同步。

2. 条件变量

①初始化

pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;

②等待条件成熟

pthread_wait(&cond_ready, &mutex); //会对mutex先进行解锁操作

③设置成熟条件

pthread_cond_signal(&cond_ready)

3. 简单实例

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

pthread_t work1Id;
pthread_t work2Id;

int work1Ret = 1;
int work2Ret = 2;

pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int number = 0;

void* Work1(void* args)
{
    int i = 0;
    
    printf("I am work%d\n", *((int*)args));
    
    for(i = 0; i < 10; i++)
    {
        pthread_mutex_lock(&mutex);
        number++;
        
        if(number >= 10)
        {
            printf("I am work%d, Finish\n", *((int*)args));
            pthread_cond_signal(&cond_ready);
        }
        
        pthread_mutex_unlock(&mutex);
        
        printf("I am work%d, number = %d\n", *((int*)args), number);
        
        sleep(1);
    }
    
    return &work1Ret;
}

void* Work2(void* args)
{
    
    printf("I am work%d\n", *((int*)args));
    pthread_mutex_lock(&mutex);
    
    if(number <= 10)
    {
        pthread_cond_wait(&cond_ready, &mutex);
        
        printf("I am work%d, number = %d\n", *((int*)args), number);
    }
    
    return &work2Ret;
}

int main()
{
    int args1 = 1;
    int args2 = 2;
    
    void* work1Ret = NULL;
    void* work2Ret = NULL; 
    
    pthread_create(&work1Id, NULL, Work1, &args1);
    
    pthread_create(&work2Id, NULL, Work2, &args2);
    
    pthread_join(work1Id, &work1Ret);
    
    if(work1Ret != NULL)
    {
        printf("work1Ret = %d\n", *((int*)work1Ret));
    }
    
    pthread_join(work2Id, &work2Ret);
    
    if(work2Ret != NULL)
    {
        printf("work2Ret = %d\n", *((int*)work2Ret));
    }
    
    return 0;
}

 

转载于:https://www.cnblogs.com/wulei0630/p/6668652.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值