Linux 多线程编程

Linux 多线程编程

ID:41032527

大小:26.99 KB

页数:7页

时间:2019-08-14

Linux 多线程编程_第1页
Linux 多线程编程_第2页
Linux 多线程编程_第3页
Linux 多线程编程_第4页
Linux 多线程编程_第5页
资源描述:

《Linux 多线程编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、进行多线程编程,最头疼的就是那些共享的数据。因为你无法知道哪个线程会在哪个时候对它进行操作,你也无法得知那个线程会先运行,哪个线程会后运行。下面介绍一些技术,通过他们,你会合理安排你的线程之间对资源的竞争。l         互斥体Mutexl         信号灯Semophorel         条件变量Conditions先说一下互斥量。什么时候会用上互斥量了?比如你现在有一全局链表,你有几个工作线程。每一个线程从该链表中取出头节点,然后对该头节点进行处理。比如现在线程1正在取出头节点,他的操作如下:Item*p=queue_list;Queue_list=qu

2、eue_list->next;Process_job(p);Free(p);当线程1处理完第一步,也就是Item*p=queue_list后,这时候系统停止线程1的运行,改而运行线程2。线程2照样取出头节点,然后进行处理,最后释放了该节点。过了段时间,线程1重新得到运行。而这个时候,其实p所指向的节点已经被线程2释放掉,而线程1对此毫无知晓。他会接着运行process_job(p)。而这将导致无法预料的后果!对于这种情况,系统给我们提供了互斥量。你在取出头节点前必须要等待互斥量,如果此时有其他线程已经获得该互斥量,那么线程将会阻塞在这个地方。只有等到其他线程释放掉该互斥量

3、后,你的线程才有可能得到该互斥量。为什么是可能了?因为可能此时有不止你一个线程在等候该互斥量,而系统无法保证你的线程将会优先运行。互斥量的类型为pthread_mutex_t。你可以声明多个互斥量。在声明该变量后,你需要调用pthread_mutex_init()来创建该变量。pthread_mutex_init的格式如下:int  pthread_mutex_init(pthread_mutex_t  *mutex,  const  pthread_mutex-       attr_t*mutexattr);第一个参数,mutext,也就是你之前声明的那个互斥量,第二

4、个参数为该互斥量的属性。这个将在后面详细讨论。在创建该互斥量之后,你便可以使用它了。要得到互斥量,你需要调用下面的函数:intpthread_mutex_lock(pthread_mutex_t*mutex);该函数用来给互斥量上锁,也就是我们前面所说的等待操作。互斥量一旦被上锁后,其他线程如果想给该互斥量上锁,那么就会阻塞在这个操作上。如果在此之前该互斥量已经被其他线程上锁,那么该操作将会一直阻塞在这个地方,直到获得该锁为止。在得到互斥量后,你就可以进入关键代码区了。同样,在操作完成后,你必须调用下面的函数来给互斥量解锁,也就是前面所说的释放。这样其他等待该锁的线程才有

5、机会获得该锁,否则其他线程将会永远阻塞。intpthread_mutex_unlock(pthread_mutex_t*mutex);下面给出一个简单的例子:#include#includestructjob{/*Linkfieldforlinkedlist.*/structjob*next;/*Otherfieldsdescribingworktobedone...*/};/*Alinkedlistofpendingjobs.*/structjob*job_queue;/*Amutexprotectingjob_queue.*/

6、pthread_mutex_tjob_queue_mutex=PTHREAD_MUTEX_INITIALIZER;/*Processqueuedjobsuntilthequeueisempty.*/void*thread_function(void*arg){while(1){structjob*next_job;/*Lockthemutexonthejobqueue.*/pthread_mutex_lock(&job_queue_mutex);/*Nowit’ssafetocheckifthequeueisempty.*/if(job_queue==NULL)next_

7、job=NULL;else{/*Getthenextavailablejob.*/next_job=job_queue;/*Removethisjobfromthelist.*/job_queue=job_queue->next;}/*Unlockthemutexonthejobqueuebecausewe’redonewiththequeuefornow.*/pthread_mutex_unlock(&job_queue_mutex);/*Wasthequeueempty?Ifso,endthethread.*/if(nex

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。