关于多线程的个人理解
2012-12-13 13:45
239 查看
之前一直在做多线程,但是感觉一直没有理解透彻,今天看了一哥们儿的程序有了一点自己的理解,特此记!
先来看一个我自己写的四线程的程序:
/*
* =====================================================================================
*
* Filename: synchronization_thread.c
*
* Description: synchronization of thread
*
* Version: 1.0
* Created: 12/12/2012 06:57:48 PM
* Revision: none
* Compiler: gcc
*
* Author: KangLu(kangludezhanghao@live.com),
* Organization: SmortOptLab of South-Central University For Nationalities
*
* =====================================================================================
*/
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
int fun1(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun1 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun1. */
int fun2(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun2 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun2. */
int fun3(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun3 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun3. */
int fun4(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun4 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun4. */
int main(void)
{
pthread_t id1,id2,id3,id4;
int i,ret;
ret=pthread_create(&id1,NULL,(void *)fun1,NULL);
if(ret!=0)
{
printf("Create thread1 error!\n");
exit(1);
}/* Create thread1. */
ret=pthread_create(&id2,NULL,(void *)fun2,NULL);
if(ret!=0)
{
printf("Create thread2 error!\n");
exit(1);
}/* Create thread2. */
ret=pthread_create(&id3,NULL,(void *)fun3,NULL);
if(ret!=0)
{
printf("Create thread3 error!\n");
exit(1);
}/* Create thread3. */
ret=pthread_create(&id4,NULL,(void *)fun4,NULL);
if(ret!=0)
{
printf("Create thread4 error!\n");
exit(1);
}/* Create thread4. */
/*
for(i=0;i<3;i++)
{
printf("main thread is runing!****%d\n",i);
sleep(i*10);
}
*/
#ifdef JOIN
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_join(id3,NULL);
pthread_join(id4,NULL);
#endif
while(1)
{
printf("main thread is runing!\n");
}
return 0;
}/* End of main. */
这个程序一共有四个线程,实现了四个线程和主线程不停的、交叉的跑,永远不退出。
关于线程:就像在医院里面,为了保证病人的手术能够成功,为医生配备了几名护士,医生作为主线程,护士作为创建的线程,由于这个多线程同时完成为病人动手术这一任务。医生负责主刀,一位护士负责为医生递送器具,一位护士为医生擦汗,他们共同完成未病人动手术这一任务,当然效率就高病人生存的希望就大。这就是多线程的好处。
在但CPU情况下,某一时刻只能允许有一个线程执行。那么为什么还要编写多线程呢?我们已经注意到了,我们写的每一个线程都能独立的完成一个任务,当该程序移植到多CPU机器上时就能真正的实现并发的同时运行了,那我们是否用多进程的程序来取代多线程呢?当然是可以的,但是还是尽量选择多线程,有两个原因:一是对进程创建来说,系统要为进程分配私有的虚拟地址空间,当然这样占用的资源就比较多,而对于多线程程序来讲,多个线程是共享同一个进程的地址空间,所以占用资源较少。二是当进程切换时需要交换整个地址空间,而线程切换只是执行环境的改变,因此效率比较高。
一个多线程程序,在主线程尚在运行的情况下当创建的新线程执行完成时会自动退出新创建的线程,因此要想使新创建的线程永远的执行下去不退出,那么就需要加死循环。
有些朋友就在想,加了死循环那不一直都执行那一个线程,不会切换到其他线程啊。错,线程是共享进程的资源的,就像系统给进程分配时间片一样,进程也会给线程分配线程的时间片,只不过这个时间片长短可以自己定。当某线程的时间片到来时,暂停该线程,执行切换,只有当轮到下一个它的时间片时才会继续执行。
不知自己理解对不,希望看客指正!
先来看一个我自己写的四线程的程序:
/*
* =====================================================================================
*
* Filename: synchronization_thread.c
*
* Description: synchronization of thread
*
* Version: 1.0
* Created: 12/12/2012 06:57:48 PM
* Revision: none
* Compiler: gcc
*
* Author: KangLu(kangludezhanghao@live.com),
* Organization: SmortOptLab of South-Central University For Nationalities
*
* =====================================================================================
*/
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
int fun1(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun1 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun1. */
int fun2(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun2 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun2. */
int fun3(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun3 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun3. */
int fun4(void)
{
int i;
while(1)
{
for(i=0;i<3;i++)
{
printf("fun4 is runing!****%d\n",i);
//sleep(i);
}
}
return 0;
}/* End of fun4. */
int main(void)
{
pthread_t id1,id2,id3,id4;
int i,ret;
ret=pthread_create(&id1,NULL,(void *)fun1,NULL);
if(ret!=0)
{
printf("Create thread1 error!\n");
exit(1);
}/* Create thread1. */
ret=pthread_create(&id2,NULL,(void *)fun2,NULL);
if(ret!=0)
{
printf("Create thread2 error!\n");
exit(1);
}/* Create thread2. */
ret=pthread_create(&id3,NULL,(void *)fun3,NULL);
if(ret!=0)
{
printf("Create thread3 error!\n");
exit(1);
}/* Create thread3. */
ret=pthread_create(&id4,NULL,(void *)fun4,NULL);
if(ret!=0)
{
printf("Create thread4 error!\n");
exit(1);
}/* Create thread4. */
/*
for(i=0;i<3;i++)
{
printf("main thread is runing!****%d\n",i);
sleep(i*10);
}
*/
#ifdef JOIN
pthread_join(id1,NULL);
pthread_join(id2,NULL);
pthread_join(id3,NULL);
pthread_join(id4,NULL);
#endif
while(1)
{
printf("main thread is runing!\n");
}
return 0;
}/* End of main. */
这个程序一共有四个线程,实现了四个线程和主线程不停的、交叉的跑,永远不退出。
关于线程:就像在医院里面,为了保证病人的手术能够成功,为医生配备了几名护士,医生作为主线程,护士作为创建的线程,由于这个多线程同时完成为病人动手术这一任务。医生负责主刀,一位护士负责为医生递送器具,一位护士为医生擦汗,他们共同完成未病人动手术这一任务,当然效率就高病人生存的希望就大。这就是多线程的好处。
在但CPU情况下,某一时刻只能允许有一个线程执行。那么为什么还要编写多线程呢?我们已经注意到了,我们写的每一个线程都能独立的完成一个任务,当该程序移植到多CPU机器上时就能真正的实现并发的同时运行了,那我们是否用多进程的程序来取代多线程呢?当然是可以的,但是还是尽量选择多线程,有两个原因:一是对进程创建来说,系统要为进程分配私有的虚拟地址空间,当然这样占用的资源就比较多,而对于多线程程序来讲,多个线程是共享同一个进程的地址空间,所以占用资源较少。二是当进程切换时需要交换整个地址空间,而线程切换只是执行环境的改变,因此效率比较高。
一个多线程程序,在主线程尚在运行的情况下当创建的新线程执行完成时会自动退出新创建的线程,因此要想使新创建的线程永远的执行下去不退出,那么就需要加死循环。
有些朋友就在想,加了死循环那不一直都执行那一个线程,不会切换到其他线程啊。错,线程是共享进程的资源的,就像系统给进程分配时间片一样,进程也会给线程分配线程的时间片,只不过这个时间片长短可以自己定。当某线程的时间片到来时,暂停该线程,执行切换,只有当轮到下一个它的时间片时才会继续执行。
不知自己理解对不,希望看客指正!
相关文章推荐
- Android关于沉浸式的个人理解
- 谈谈多线程编程的个人理解(数据私有变量)
- 关于Bean\Entity\Model\POJO的一些个人理解
- 关于Python中,re.sub(pattern, repl, string, count=0, flags=0)方法的个人理解
- 关于coordinatorLayout的应用的个人理解
- 关于JavaScript 原型链的一点个人理解
- 写出关于多线程的方式和状态以及你对线程池的理解!
- 关于launcher的个人理解
- [转]关于内存地址的个人理解和操作原理
- 关于程序动态库链接和运行时搜索路径设置的个人理解
- 关于正向代理,反向代理,负载均衡的个人理解
- 关于闭包的个人理解
- 关于高维空间的个人理解
- 关于Android中View滑动知识的一点个人理解
- 关于Online Redo Log(ORL)和Standby Redo Log(SRL)的个人理解
- 关于信息熵与期望的关系的个人理解
- 关于代理模式的个人理解
- 关于算法中“RSA”,“数字签名”等名词的解释和个人理解
- 关于微信获取用户信息报errorcode:40001错,个人踩坑理解
- 关于jquery的jquery.autocomplete(自动补全)插件的个人理解