线程解析(三)
2009-12-11 10:40
155 查看
作者:曹忠明,华清远见嵌入式学院讲师。
前面我们说了线程的创建和撤销,这里我们说一下线程间的同步的问题。
当同一个进程中存在多个线程的时候,多个线程共享相同的内存,确保每个线程能够看到一致的数据视图,如果每个线程中都不会读取或修改共同享有的变量,就不会存在一致性的问题,同样如果共享变量时只读的也就不会存在这个问题。但是,当某个线程可一个修改变量,而其他的线程去读取或修改这个变量的时候,就需要进行线程间的同步,确保他们访问变量的内容时不会访问到无效的数据。
这里介绍一种实现同步的方法:互斥量
互斥锁本质上是一把锁,在访问共享资源的时候对互斥量进行加锁,访问结束后解锁。在这里我们说一下如何去操作互斥锁。
1、 创建和撤销
互斥量用pthread_mutex_t数据类型来表示,在使用之前必须对其进行初始化,用完之后释放内存。互斥量初始化可以用PTHREAD_MUTEX_INITIALIZER来初始化(静态初始化),亦可以使用pthread_mutex_init函数来实现,这种方法动态的为互斥量分配内存,使用后必须使用pthread_mutex_destroy来释放内存单元。下面是这些函数的原型:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
2、 锁操作
锁操作主要包括加锁pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试锁pthread_mutex_trylock()三个。通过pthread_mutex_lock对互斥量加锁,这里需要获得锁,如果无法获得锁则调用线程将阻塞到其他线程调用pthread_mutex_unlock对互斥量解锁。
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
如果线程不希望被阻塞,则可以调用pthread_mutex_trylock尝试对互斥量进行加锁,当互斥量没有被加锁,则函数返回0,并锁住互斥量,否则会失败,返回EBUSY.
3、 示例
下面我们用一个例程说明一下这些函数的使用。
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex;
void *thread_a(void *arg)
{
printf("thread a enter/n");
pthread_mutex_lock(&mutex);
printf("mutex lock/n");
sleep(10);
pthread_mutex_unlock(&mutex);
printf("mutex unlock/n");
}
void *thread_b(void *arg)
{
printf("thread b enter/n");
while(pthread_mutex_trylock(&mutex))
{
printf("pthread trylock/n");
sleep(1);
}
printf("mutex lock/n");
pthread_mutex_unlock(&mutex);
printf("mutex unlock/n");
}
int main(int argc, char **argv)
{
pthread_t tid_a,tid_b;
int err;
if(pthread_mutex_init(&mutex, NULL) != 0)
{
perror("pthread_mutex_init");
}
err = pthread_create(&tid_a,NULL,thread_a,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
sleep(1);
err = pthread_create(&tid_b,NULL,thread_b,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
sleep(20);
printf("the main close/n");
return 0;
}
结果:
thread a enter
mutex lock
thread b enter
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
mutex unlock
mutex lock
mutex unlock
the main close
由这里的结果可以看出mutex的用处及几个相关函数的使用方法。
前面我们说了线程的创建和撤销,这里我们说一下线程间的同步的问题。
当同一个进程中存在多个线程的时候,多个线程共享相同的内存,确保每个线程能够看到一致的数据视图,如果每个线程中都不会读取或修改共同享有的变量,就不会存在一致性的问题,同样如果共享变量时只读的也就不会存在这个问题。但是,当某个线程可一个修改变量,而其他的线程去读取或修改这个变量的时候,就需要进行线程间的同步,确保他们访问变量的内容时不会访问到无效的数据。
这里介绍一种实现同步的方法:互斥量
互斥锁本质上是一把锁,在访问共享资源的时候对互斥量进行加锁,访问结束后解锁。在这里我们说一下如何去操作互斥锁。
1、 创建和撤销
互斥量用pthread_mutex_t数据类型来表示,在使用之前必须对其进行初始化,用完之后释放内存。互斥量初始化可以用PTHREAD_MUTEX_INITIALIZER来初始化(静态初始化),亦可以使用pthread_mutex_init函数来实现,这种方法动态的为互斥量分配内存,使用后必须使用pthread_mutex_destroy来释放内存单元。下面是这些函数的原型:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
2、 锁操作
锁操作主要包括加锁pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试锁pthread_mutex_trylock()三个。通过pthread_mutex_lock对互斥量加锁,这里需要获得锁,如果无法获得锁则调用线程将阻塞到其他线程调用pthread_mutex_unlock对互斥量解锁。
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
如果线程不希望被阻塞,则可以调用pthread_mutex_trylock尝试对互斥量进行加锁,当互斥量没有被加锁,则函数返回0,并锁住互斥量,否则会失败,返回EBUSY.
3、 示例
下面我们用一个例程说明一下这些函数的使用。
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex;
void *thread_a(void *arg)
{
printf("thread a enter/n");
pthread_mutex_lock(&mutex);
printf("mutex lock/n");
sleep(10);
pthread_mutex_unlock(&mutex);
printf("mutex unlock/n");
}
void *thread_b(void *arg)
{
printf("thread b enter/n");
while(pthread_mutex_trylock(&mutex))
{
printf("pthread trylock/n");
sleep(1);
}
printf("mutex lock/n");
pthread_mutex_unlock(&mutex);
printf("mutex unlock/n");
}
int main(int argc, char **argv)
{
pthread_t tid_a,tid_b;
int err;
if(pthread_mutex_init(&mutex, NULL) != 0)
{
perror("pthread_mutex_init");
}
err = pthread_create(&tid_a,NULL,thread_a,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
sleep(1);
err = pthread_create(&tid_b,NULL,thread_b,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
sleep(20);
printf("the main close/n");
return 0;
}
结果:
thread a enter
mutex lock
thread b enter
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
pthread trylock
mutex unlock
mutex lock
mutex unlock
the main close
由这里的结果可以看出mutex的用处及几个相关函数的使用方法。
相关文章推荐
- unix环境高级编程-线程解析
- java中Thread中线程函数的解析
- java线程之start方法与run方法解析以及currentThread与this解析
- java线程深度解析(二)——线程互斥技术与线程间通信
- 深入解析Java的线程同步以及线程间通信
- 线程解析(四)
- java线程深度解析(三)——并发模型(Future)
- java线程深度解析(六)——线程池技术
- 一个故事贯穿线程的一生(超级直白的解析!)
- 解析Java线程同步锁的选择方法
- Java 线程 sleep wait 深入解析 Thread
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析
- 线程实用解析--------(一)线程初识
- 线程实用解析---------(四)异步操作
- 【学习笔记】【深入解析Windows操作系统(第四版)】【进程、线程】
- JAVA学习笔记--线程请求Json数据,并解析绑定到listView
- 实例解析Java中的synchronized关键字与线程安全问题
- PHP 线程安全与非线程安全版本的区别深入解析
- java中线程阻塞之sleep、suspend、join、wait、resume、notify方法解析(一)
- Linux 进程与线程概念解析