前面两节讲了线程的一些基础知识,这一节还是关于线程的内容,主要说一下线程的同步问题。线程的同步是一个很重要的内容,因为这关系到线程之间的协调合作,否则可能会产生冲突。线程的同步通常可以用互斥锁和条件变量来解决。 1、互斥锁互斥锁是一个简单的锁定命令,它可以用来锁定对共享资源的访问,对于线程来说,整个地址空间都是共享的资源,所以线程的任何资源都是共享的。对于互斥锁的理解,我们可以打个这样的比方: 比如厕所就是共享资源,如果你想要上厕所,看到厕所里没人,那么你就可以进去,然后把锁给锁上,这个时候如果别人也想要上厕所,他是没有办法的,他只能等待你出来之后才可以获取厕所这个资源。而你出来之后,这个资源就被释放了,也就是互斥锁的解锁,这个时候别人可以获得这个资源,同时进行上锁,对资源的访问进行保护,防止发生冲突。 在使用互斥锁的时候,首先要进行初始化:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);
第一个参数是互斥锁对象,第二个参数是互斥锁的属性,属性我们一般使用默认的就好了。成功返回0,失败返回错误编号。如果要销毁一个互斥锁,可以使用下面的函数:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
初始化完了之后,我们就可以对互斥锁进行加锁,加锁有两个函数可以调用:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
如果上锁成功都是返回0,如果上锁失败,第一个函数会被阻塞,而第二个函数会立即返回,并且返回一个错误编号。解锁函数:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
互斥锁的使用比较简单,它就是用在对某些资源的访问的时候进行保护,在访问某个资源之前先上锁,访问完之后再解锁,这样在访问期间就不会有其他的程序试图访问而造成冲突。 2、条件变量互斥锁可以解决一些资源竞争的问题,但是互斥锁只有两种状态,这使得它的用途非常有限,条件变量也可以解决线程同步问题,