线程同步与线程安全

一、 线程同步
1.1为什么要进行线程同步?
当多个线程共享同一内存的时候,可能会出现某个线程在修改变量,而另一线程读取到不一致的数据。所以不得不使用锁,在同一时间只允许一个线程访问该变量。
如图描述这种同步,如果线程B要读取该变量,首先要获得锁。同样,线程A要更新该变量,也要获取同样的这把锁。也就是线程B在线程A释放这把锁之前不能读取该变量。
这里写图片描述
1.2 互斥锁
概念: 实现线程访问临界资源的同步控制。 如果一个线程在临界区开始时,给互斥锁加锁, 那么其他的线程就必须等待线程解锁, 才能接着运行, 并访问资源。
操作: 初始化, 加锁、 解锁、 销毁锁
互斥锁: pthread_mutex_t 锁类型
锁初始化:
int pthread_mutex_init(pthread_mutex_t *mutex,
pthread_mutexattr_t *attr);
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
销毁锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);

练习题:
主线程负责接收用户输入, 函数线程统计用户输入的字符个数。
char buff[128]={0};
pthread_mutex_t mutex;

void *pthread_fun(void *arg)
{
    while(1)
    {
        pthread_mutex_lock(&mutex);  //函数线程加锁(必须在主线程之后);
        int count=0;
        while(1)
        {
            if(buff[count]==0 || buff[count]=='\n')
            {
                break;
            }
            count++;

        }
        printf("count==%d\n",count);
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}
void main()
{
    pthread_t id;
    pthread_mutex_init(&mutex,NULL);  
    pthread_mutex_lock(&mutex);      //主线程加锁;
    int res=pthread_create(&id,NULL,pthread_fun,NULL);
    assert(res==0);
    while(1)
    {
        printf("please input:\n");
        fflush(stdout);
        fgets(buff,128,stdin);       //主线程获取用户输入;
        pthread_mutex_unlock(&mutex);
        if(strncmp(buff,"end",3)==0)
        {
            break;
        }
        sleep(1);
        pthread_mutex_lock(&mutex);
    }
    pthread_mutex_unlock(& mutex);
    pthread_join(id,NULL);
    pthread_mutex_destroy(& mutex);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值