Linux系统是一款应用广泛的操作系统,它的产生改变了历史的发展轨迹,它的发展奠定了开源技术的格局,给予了软件界和硬件界另一种选择。Linux并发性能强、硬件资源充分利用率高,它开始在许多领域发挥着应用价值,其中最重要的开发技术就是多线程技术。
线程是操作系统中一种轻量级的可执行单元,它不是一个独立的完整的程序,而是被一个进程拥有并在运行期间而存在,常见的多线程编程语言有c/c++、Java、Ruby、Python等。通过多个线程的同时运行,让程序的焦点可以有效的分散和重新聚集。
Linux系统下多线程应用常见于 服务器 端、索引系统、查询系统以及网络程序中。如Apache就是使用多线程技术来支持多个客户端访问;MySQL也使用多线程技术来处理多个客户端的查询请求;nginx采用多线程的方式来处理客户端的请求,减少延迟。同时,在用户层面,如音视频、用户界面和桌面等。
如何使用Linux系统下的多线程技术呢?使用POSIX线程库的函数pthread_create()可以创建多线程,下面是一段简单的多线程程序:
/* Create thread 1 */
void* thread1(void* args)
// Do something
return NULL;
/* Create thread 2 */

void* thread2(void* args)
// Do something
return NULL;
pthread_t thread1_handle;
pthread_t thread2_handle;
// Create thread 1 and thread 2
pthread_create(&thread1_handle, NULL, thread1, NULL);
香港服务器首选树叶云,2H2G首月10元开通。树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
安卓手机如何打开.so文件?
安卓手机想要查看文件就需要下载Native Libs Monitor。
这个应用可以帮助我们理解手机上安装的APK用到了哪些文件,以及文件来源于哪些函数库或者框架。 我们也可以自己对APP反编译来获取这些信息。
so文件是手机的一些运行库文件,在系统lib的文件夹下,置换移植其他系统的程序也需要修改更换相关so文件。
没有它系统软件不能运行,哪部分损坏就影响相对功能,电话接打,通讯录,相机等等都是要依赖so文件使用的。
linux下怎么在等待线程结束中设置超时
多线程退出有三种方式:(1)执行完成后隐式退出;(2)由线程本身显示调用pthread_exit函数退出;pthread_exit(void*retval);(3)被其他线程用pthread_cance函数终止:pthread_cance(pthread_tthread);用event来实现。 在子线程中,在循环内检测event。 while(!_active()){}当退出循环体的时候,自然return返回。 这样子线程会优雅的结束。 注意:选用非等待的检测函数。 pthread线程有两种状态,JOINable(非分离)状态和detachable(分离)状态,默认为joinable。 joinable:当线程函数自己返回退出或pthread_exit时都不会释放线程所用资源,包括栈,线程描述符等(有人说有8k多,未经验证)。 detachable:线程结束时会自动释放资源。 LinuxmanPagesaid:Whenajoinablethreadterminates,itsmemoryresources(threaddescriptorandstack)arenotdeallocateduntilAnotherthreadperformspthread_,pthread_joinmustbecalledonceforeachjoinablethreadcreatedtoavoidmemoryleaks.因此,joinable线程执行完后不使用pthread_join的话就会造成内存泄漏。 解决法:1.//创建线程前设置PTHREAD_CREATE_DETACHED属性pthread_attr_tattr;pthread_tthread;pthread_attr_init(&attr);pthread_attr_setdetachstat(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&thread,&attr,&thread_function,NULL);pthread_attr_destroy(&attr);2.当线程为joinable时,使用pthread_join来获取线程返回值,并释放资源。 3.当线程为joinable时,也可在线程中调用pthread_detach(pthread_self());来分离自己。
怎么样才算得上熟悉多线程编程
1. 了解进程线程的基本概念,能用一种语言在一个平台上实现一个多线程的例子。 (这些不会还写熟悉多线程就太大无畏了)2. 了解为什么要用Mutex之类的工具做锁来同步和保护资源。 弄懂诸如racing condition,死锁之类的概念。 50%公司的见面题,用来砍死大无畏。 3. 了解编译器优化带来的影响,了解cache的影响,了解volatile,memory barrier之类的概念。 如果是主Java的话,去了解一下JVM的内存模型。 以上这些偏硬偏系统端的公司喜欢问,不过由于太基础,稍稍好奇一点的多线程领域程序员都应该会了解,否则略显大无畏。 4. 了解一下你主攻平台+语言所提供的工具库,知道常用的工具的用法和使用场景:Mutex,Semaphore,原子操作集,Condition Variable,spin lock。 这几个算是比较常用的,在各个平台+语言也都有对应实现。 老实说,spinlock,condition variable是我工作里从没用过的,但是也被问过,其他几个都太常用了,如果是java的话再多看一组Executor相关的,以及Java多线程相关的Keywords,和object本身提供的同步函数,wait notify之类的,在主Java的公司问过。 5. 了解常用的多线程设计范式,比如读写锁(Reader/Writer Lock,非常经典的范式,有偏向读和写的不同变形,至少被要求写过3次),生产消费范式(写过2次),一些常用容器的实现,比如BlockingQueue(写过3次)或者concurrentHashmap(写过2次)。 如果是主Java的话可以看看JDK的实现。 熟悉一下一些算不上多线程设计模式的小技巧,比如传递只读对象可以避免加锁,或者Copy传递以防外部修改之类的(讨论环节被问过)。 另外值得特别一提的一个小细节是,Singleton的线程安全是个很有意思而且容易出错的话题,值得一看(只被问过一次,不过我答挂了,所以印象及其深)。 还有可能会问的是一些有趣的小场景让你实现一些功能需要线程安全,无法特别准备,但是你能了解上面说的这些范式,不傻的话大多数都能想出来。
发表评论