linux线程同步问题

来源:互联网 发布:淘宝客信息采集软件 编辑:程序博客网 时间:2024/06/08 22:55

线程最大的特点就是资源的共享性,然而资源共享中的同步问题是多线程编程的难点。Linux系统提供了多种方式来处理线程同步的问题,其中最常用的是互斥锁,条件变量和异步信号。

一.互斥锁

互斥锁通过锁机制来实现线程间同步。

1.初始化锁。

在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前 要对它进行初始化。

    a.静态赋值法:pthread_mutex_t mutex=PTHREAD_MUTEX_INITALIZER    b.通过pthread_mutex_init函数,该函数原型如下:Int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

2.加锁。

对共享资源的访问,要对互斥量进行加锁,如果互斥量已经加锁,当前尝试加锁的线程就会阻塞,直到互斥锁被其他线程释放。

a.int pthread_mutex_lock(pthread_mutex_ *mutex)b.int pthread_mutex_tylock(pthread_mutex_t *mutex)

注意:加锁时,不论是哪种类型的锁。都不可能被两个不同的线程同时得到,其中一个必须等待解锁,在同一进程中的线程,如果加锁后没有解锁,则其他线程将无法再获得该锁。

3.解锁。

完成了对共享资源的访问后,要对互斥锁进行解锁。需满足一下条件:

a.互斥锁必须处于加锁状态

b.调用本函数的线程必须是给互斥锁加锁的状态

函数原型是:int pthread_mutex_unlock(pthread_mutex_t *mutex)

4.清除互斥锁。

清除一个互斥锁的目的在于释放它所占用的资源。该函数原型如下:int pthread_mutex_destory (pthread_mutex_t *mutex)

在上述的代码中,两个函数对共享全局变量globalnumber进行读写操作。write_globalnumber函数使用互斥锁保证在修改变量的时候操作一次执行完毕,不会中断。而read_globalnumber函数使用互斥锁保证在读数据的时候,全局变量globalnumber不会被修改,确保读到正确的数据。

二.条件变量

条件变量是利用线程间共享的全局变量进行同步的一种机制。条件变量宏观上类似if语句,符合条件就能执行某段程序,否则只能等待条件成立。使用条件变量主要包括两个动作:一个等待使用资源的线程等待“条件变量被设置为真”;另一个线程在使用完资源后“设置条件为真”,这样就可以保证线程间的同步了。

1.初始化条件变量

a.静态赋值法:pthread_cond_t cond=PTHREAD_COND_INITALER

b.使用函数pthread_cond_init 函数原型如下:

int pthread_cond_init(pthread_cond_t*cond pthread_condattr_t *cond_attr)

2.等待条件成立。

释放由mutex指向的互斥锁,同时阻塞等待条件变量为真才行。timewait函数将阻塞直到条件变量获得信号或者经过abstime指定的时间,也就是说,如果在给定时刻前条件没有满足,则返回ETMEOUT,结束等待。

 A.Int pthread_cond_wait(pthread_cond_t cond pthread_mutex_t *mutex) B.int pthread_cond_timewait(pthread_cond_t*cond pthread_mutex*mutex.const timespec *abstime)

3.激活条件变量

Pthread_cond_signal和pthread_cond_broadcast激活所有等待的线程。

A.int pthread_cond_signal(pthread_cond_t *cond);B.Int pthread_cond_broadcast(pthread_cond_t *cond);

注意:pthread_cond_signal()激活一个等待条件成立的线程,存在多个等待线程时,则按顺序激活其中的一个;而pthread_cond_broadcast()则激活所有的等待线程。

4.清除条件变量

只有在没有线程等待该条件变量的时候才能清除这个条件变量,否则返回EBUSY。
执行代码结果如下:

                  condition variable study!                  thread1 is running                   thread2 is running                  thread2 applied the condition                  thread1 applied the condition                  thread2 is running                  thread2 applied the condition                  thread2 is running                  thread2 applied the condition                  thread2 is running                  thread2 applied the condition

结果分析:截取的部分结果,从运行结果来看,thread1和thread2通过条件变量同步运行。在线程函数thread1中可以看到条件变量使用时要配合互斥锁使用,这样可以防止多个线程同时请求pthread_cond_wait()。调用pthread_cond_wait()前必须由本线程加锁,而在更新条件等待队列以前,mutex保持锁定状态,并在线程挂起前解锁。在条件满足离开pthread_cond_wait()之前,mutex将重新加锁。

三.异步信号

信号与任何线程都是异步的,也就是说信号到达线程的时间是不定的,如果有多个线程可以接收异步信号,则只有一个被选中。如果并发的多个同样的信号被送到一个进程,每一个将被不同的线程处理。如果所有的线程屏蔽该信号,则这些信号将被挂起。直到有信号解除屏蔽来处理它们。

0 0
原创粉丝点击