小例子实现互斥锁,自旋锁
在多线程并发访问临界区时,使用上面三种操作,可以实现并发访问。
首先创建是个线程
for(i = 0;i<THREAD_COUNT;i++)
{
pthread_create(&threadid[i],NULL,thread_callback,&count);//返回线程的ID传回的是地址
}
其次编辑回调函数,回调函数实现的是让pcount的值达到1000000,达到一百万的过程是十个线程的共同作用结果。
void thread_callback(void *arg)
{
int *pcount = (int *)arg;
int i = 0;
while(i++ <100000)
{
(*pcount)++;
pthread_mutex_unlock(&mutex);
inc(pcount,1);
usleep(1);
}
}
在实现的过程中,会出现打断,达到预期效果
- 自旋锁实现临界区访问
//创建自旋锁
pthread_spinlock_t spinlock;
//初始化自旋锁
pthread_spinlock_init(&spinlock);
//开锁
pthread_spin_lock(&lock);
//关锁
pthread_spin_unlock(&lock);
void thread_callback(void *arg)
{
int *pcount = (int *)arg;
int i = 0;
while(i++ <100000)
{
pthread_spin_lock(&mutex);
(*pcount)++;
pthread_spin_unlock(&mutex);
usleep(1);
}
}
自旋锁过程是:自旋等待,访问,返回。适用于自旋锁的条件是锁中执行的内容尽可能的少。
2. 互斥锁
互斥锁的实现与自旋锁类似,
//创建互斥锁
pthread_mutex_t mutex;
//初始化互斥锁锁
pthread_mutex_init(&mutex,NULL);;
//开锁
pthread_mutex_lock(&mutex);
//关锁
pthread_mutex_unlock(&lock);
pthread_mutex_lock(&mutex);
(*pcount)++;
pthread_mutex_unlock(&mutex);
互斥锁实现时,当发现临界区上锁,无法访问,应当让出CPU进入阻塞状态。