龙空技术网

linux多线程同步—互斥锁

一道闪电惊天雷 63

前言:

而今看官们对“互斥锁实现双线程轮流执行”大体比较着重,你们都想要剖析一些“互斥锁实现双线程轮流执行”的相关知识。那么小编在网摘上搜集了一些关于“互斥锁实现双线程轮流执行””的相关知识,希望我们能喜欢,大家一起来学习一下吧!

linux多线程编程-互斥锁

锁机制

多线程之间可能需要互斥的访问一些全局变量,这就需要互斥的来访问,这些需要共享访问的字段被称作是临界资源,访问临界资源的程序段称作是临界区。

实现线程间的互斥与同步机制的是锁机制,下面是常用的锁机制的函数和类

pthread_mutex_t mutex 锁对象

pthread_mutex_init(&mutex,NULL) 在主线程中初始化锁为解锁状态

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER 编译时初始化锁位解锁状态

pthread_mutex_lock(&mutex)(阻塞加锁)访问临界区加锁操作

pthread_mutex_trylock( &mutex)(非阻塞加锁); pthread_mutex_lock() 类似,不同的是在锁已经被占据时返回 EBUSY 而不是挂起等待。

pthread_mutex_unlock(&mutex): 访问临界区解锁操作

#include<stdio.h>

#include<pthread.h>

#include<errno.h>

#include<stdlib.h>

#include<unistd.h>

void* ticketport1(void*);

void* ticketport2(void*);

int tickets=100;

pthread_mutex_t mutex;

int main()

{

int ret;

pthread_t id1,id2;

pthread_mutex_init(&mutex,NULL); 初始化互斥量 ret=pthread_create(&id1,NULL,ticketport1,NULL);

if(ret<0) {

perror("creat thread1:"); exit(-1);

}

ret=pthread_create(&id2,NULL,ticketport2,NULL);

if(ret<0)

{

perror("creat thread2:"); exit(-1);

}

pthread_join(id1,NULL);

pthread_join(id2,NULL);

}

void* ticketport1(void* arg)

{

while(1)

{

pthread_mutex_lock(&mutex); //给互斥量上锁

if(tickets>0)

{

usleep(1000);

printf("thread1 sell ticket: %d\n",tickets--); pthread_mutex_unlock(&mutex); //给互斥量解锁

} else

{

pthread_mutex_unlock(&mutex); //给互斥量解锁

break;

}

pthread_yield(); //线程的调度函数,使两个线程都有执行机会

}

return (void*)0;

}

void* ticketport2(void* arg)

{

while(1)

{

pthread_mutex_lock(&mutex); //给互斥量上锁

if(tickets>0)

{

usleep(1000);

printf("thread2 sell ticket: %d\n",tickets--); pthread_mutex_unlock(&mutex); //给互斥量解锁

} else

{

pthread_mutex_unlock(&mutex); //给互斥量解锁

break;

}

pthread_yield(); //线程的调度函数,使两个线程都有执行机会

}

return (void*)0;

}

我们用pthread_mutext_init函数来初始化互斥量,然后再用pthread_mutex_lock函数和 pthread_mutext_unlock分别进行上锁和解锁,至于这两个函数的参数说明,大家可以上网查阅,在这我只说明功能。我们用gcc带选项 -lpthread编译后多次执行发现即使强制线程在很短的时间内(如1ms)睡眠引起线程切换,也不会导致上述的问题,说明互斥锁可以解决线程间的同步 问题

标签: #互斥锁实现双线程轮流执行