线程同步(两个线程同步 加锁)

这篇博客通过一个C语言示例展示了如何使用信号量和互斥锁进行线程同步。程序创建了两个线程,一个生产者线程负责增加全局变量value,另一个消费者线程负责读取并增加该变量。在每次操作全局变量时,都会通过加锁和解锁确保线程安全。在Linux环境下,程序运行正常,展示了线程同步的效果。

 两个线程同步 加锁

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
#define BUFSIZE 4
#define NUMBER 8

int sum_of_number=0;
int value=0; //全局变量, 要注意加锁


/*定义两个变量 信号量*/
sem_t write_res_number;
sem_t read_res_number;

 

/* 初始化锁 ¯*/
pthread_mutex_t buffer_mutex=PTHREAD_MUTEX_INITIALIZER;

static void *producer(void * arg)
{
    int i;
   
    for(i=0;i<=12;i++)
    {
        /* 减少可写的资源数*/
        sem_wait(&write_res_number);
       
        /* 加锁 */
        pthread_mutex_lock(&buffer_mutex);
            
        value+=1;
        printf("procuder write: %d/n",value);
       
        /* 解锁 */
        pthread_mutex_unlock(&buffer_mutex);
        
                sem_post(&read_res_number);
    }
    return NULL;
}

static void * consumer(void * arg)
{
    int i,num;
   
    for(i=0;i<=12;i++)
    {
        sem_post(&write_res_number);
        sem_wait(&read_res_number);

        pthread_mutex_lock(&buffer_mutex);    
        value+=1;
        printf("read value %d./n",value);
        
          pthread_mutex_unlock(&buffer_mutex);      
    }        
    return NULL;
}

int main(int argc,char ** argv)
{
     pthread_t p_tid;
    pthread_t c_tid;
   
    sem_init(&write_res_number,0,0);
    sem_init(&read_res_number,0,0);
    
       pthread_create(&p_tid,NULL,producer,NULL);
    pthread_create(&c_tid,NULL,consumer,NULL);
    
       pthread_join(p_tid,NULL);
    pthread_join(c_tid,NULL);
    
    pthread_mutex_destroy(&buffer_mutex); /*Êջػ¥³âÁ¿×ÊÔ´*/
}

在linux 下一样.
我在cygwin  运行结果:
$ gcc -lpthread -o th th
$ ./th
procuder write: 1
read value 2.
procuder write: 3
read value 4.
procuder write: 5
read value 6.
procuder write: 7
read value 8.
procuder write: 9
read value 10.
procuder write: 11
read value 12.
procuder write: 13
read value 14.
procuder write: 15
read value 16.
procuder write: 17
read value 18.
procuder write: 19
read value 20.
procuder write: 21
read value 22.
procuder write: 23
read value 24.
procuder write: 25
read value 26.
$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值