随笔分类 - linux多线程
摘要:通用线程:POSIX 线程详解,第 3 部分使用条件变量提高效率Daniel Robbins, 总裁兼 CEO, Gentoo Technologies, Inc.简介:本文是 POSIX 线程三部曲系列的最后一部分,Daniel 将详细讨论如何使用条件变量。条件变量是 POSIX 线程结构,可以让您在遇到某些条件时“唤醒”线程。可以将它们看作是一种线程安全的信号发送。Daniel 使用目前您所学到的知识实现了一个多线程工作组应用程序,本文将围绕着这一示例而进行讨论。条件变量详解在 上一篇文章结束时,我描述了一个比较特殊的难题:如果线程正在等待某个特定条件发生,它应该如何处理这种情况?它可以重
阅读全文
摘要:创建一个线程默认的状态是joinable。如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收(退出状态码).所以创建线程者应该调用pthread_join来等待线程运行结束,并可得到线程的退出代 码,回收其资源(类似于wait,waitpid) 。但是调用pthread_join(pthread_id)后,如果该线程没有运行结束,调用者会被阻塞,在有些情况下我们并不希望如此。比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候,主线程并不希望因为调用pthread_join而阻塞(因为还要继续处理之后到来的
阅读全文
摘要:很久没看APUE,今天一位朋友问道关于一个mutex的问题,又翻到了以前讨论过的东西,为了不让自己忘记,把曾经的东西总结一下。先大体看下网上很多地方都有的关于pthread_cond_wait()的说明:条件变量 条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使"条件成立"(给出条件成立信号)。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。 1. 创建和注销 条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常
阅读全文
摘要:在SMP系统中,我们的应用程序经常使用多线程的技术,那么在Linux中如何查看某个进程的多个线程呢?本文介绍3种命令来查看Linux系统中的线程(LWP)的情况:在我的系统中,用qemu-system-x86_64命令启动了一个SMP的Guest,所以有几个qemu的线程,以此为例来说明。1. pstree 命令,查看进程和线程的树形结构关系。View CodeBASH1
2
3
4
5
[root@jay-linux ~]# pstree | grep qemu |-gnome-terminal-+-bash---qemu-system-x86---2*[{qemu-system-...
阅读全文
摘要:pthread_create()在使用的过程中遇到的一个问题: 今天在使用线程的时候出现了一个问题,利用valgrind监测程序的运行时出现了memory leak。感觉到很奇怪,这样的情况应该不会发生的啊,毕竟是系统的函数。去网上搜了下,发现国内国外都有这个问题 呵呵。大概了解了下原因:创建的线程需要进行join或者detach状态,这样才能保证创建线程过程中分配的内存得以释放,才能避免memory leak的情况。因此,记得需要将线程进行join或者detach。 线程的分离状态决定一个线程以什么样的方式来终止自己。线程的默认属性是非分离状态,这种情况下,原有的线程等待创建的线程结束。只.
阅读全文
摘要:阅读本篇之前推荐阅读以下姊妹篇:《秒杀多线程第四篇一个经典的多线程同步问题》《秒杀多线程第五篇经典线程同步关键段CS》《秒杀多线程第六篇经典线程同步事件Event》《秒杀多线程第七篇经典线程同步互斥量Mutex》《秒杀多线程第八篇经典线程同步信号量Semaphore》《秒杀多线程第九篇经典线程同步总结关键段事件互斥量信号量》《秒杀多线程第十篇生产者消费者问题》《秒杀多线程第十一篇读者写者问题》上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点。本文将会先简要介绍下PV操
阅读全文
摘要:问题:使用pthread_create()函数创建线程的时候,需要将一个类型为u8(unsigned char)的变量作为参数传送到线程函数void turnon_RelaySameTime(void *relayState)中;要传递的变量:u8 ss_relay;创建线程:retval = pthread_create(&relayOn_thread, &attr, (void *)turnon_RelaySameTime, (void *)&ss_relay);线程函数:void turnon_RelaySameTime(void *relayState) { u
阅读全文