线程解析(一)
2010-04-21 08:54
113 查看
作者:曹忠明,华清远见嵌入式学院讲师。
在使用线程之前我们要知道线程是个怎样的概念,它的作用是什么?
在学多进程或多线程编程的时候,有这样一个概念----进程是资源管理的最小单位,线程是程序执行的最小单位,相对于进程,线程上下文切换花费的开销更少。因为线程共享了内存空间,不同线程可以访问同一个变量,即多有线程都可以访问已经声明了的全局变量。在多进程中这种情况需要使用IPC(进程间通信)对象实现,这样增加了额外的开销,从而降低了性能,并且增加了代码的复杂度。
在执行方面线程也有着它的优势,因为在创建线程的过程中系统无需复制内存空间和文件描述符等,这样节省了很多的cpu时间。
首先我们了解几个相关函数
pthread_create()创建线程,函数原型为:
int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
thread 返回创建线程的ID,attr是创建线程是设置的线程属性。start_routine是线程执行体函数,arg为传递到线程执行体函数的一个参数。
下面我们写一个简单的多线程的程序。
pthread1.c
#include <stdio.h>
#include <pthread.h>
void *thread_a(void *arg)
{
printf("thread a enter/n");
}
void *thread_b(void *arg)
{
printf("thread b enter/n");
}
int main(int argc, char **argv)
{
pthread_t tid_a,tid_b;
int err;
err = pthread_create(&tid_a,NULL,thread_a,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
err = pthread_create(&tid_b,NULL,thread_b,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
sleep(5);
printf("the main close/n");
return 0;
}
在这个程序中我们创建了两个线程分别是tid_a和tid_b,thread_a和thread_b分别是他们的执行体。这个时候我们的程序中有了三个线程。因为除了我们常见的两个线程外,主程序也是一个线程。下面我们尝试一下传递一个参数到线程执行体中。
pthread2.c
#include <stdio.h>
#include <pthread.h>
void *thread_a(void *arg)
{
printf("thread a = %d enter/n",*(int *)arg);
}
void *thread_b(void *arg)
{
printf("thread b = %d enter/n", *(int *)arg);
}
int main(int argc, char **argv)
{
pthread_t tid_a,tid_b;
int err;
err = pthread_create(&tid_a,NULL,thread_a,(void *)&tid_a);
if(err < 0)
{
perror("pthread_create thread_a");
}
printf("create tid_a = %d/n",tid_a);
err = pthread_create(&tid_b,NULL,thread_b,(void *)&tid_b);
if(err < 0)
{
perror("pthread_create thread_a");
}
printf("create tid_b = %d/n",tid_b);
sleep(5);
printf("the main close/n");
return 0;
}
在使用线程之前我们要知道线程是个怎样的概念,它的作用是什么?
在学多进程或多线程编程的时候,有这样一个概念----进程是资源管理的最小单位,线程是程序执行的最小单位,相对于进程,线程上下文切换花费的开销更少。因为线程共享了内存空间,不同线程可以访问同一个变量,即多有线程都可以访问已经声明了的全局变量。在多进程中这种情况需要使用IPC(进程间通信)对象实现,这样增加了额外的开销,从而降低了性能,并且增加了代码的复杂度。
在执行方面线程也有着它的优势,因为在创建线程的过程中系统无需复制内存空间和文件描述符等,这样节省了很多的cpu时间。
首先我们了解几个相关函数
pthread_create()创建线程,函数原型为:
int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
thread 返回创建线程的ID,attr是创建线程是设置的线程属性。start_routine是线程执行体函数,arg为传递到线程执行体函数的一个参数。
下面我们写一个简单的多线程的程序。
pthread1.c
#include <stdio.h>
#include <pthread.h>
void *thread_a(void *arg)
{
printf("thread a enter/n");
}
void *thread_b(void *arg)
{
printf("thread b enter/n");
}
int main(int argc, char **argv)
{
pthread_t tid_a,tid_b;
int err;
err = pthread_create(&tid_a,NULL,thread_a,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
err = pthread_create(&tid_b,NULL,thread_b,NULL);
if(err < 0)
{
perror("pthread_create thread_a");
}
sleep(5);
printf("the main close/n");
return 0;
}
在这个程序中我们创建了两个线程分别是tid_a和tid_b,thread_a和thread_b分别是他们的执行体。这个时候我们的程序中有了三个线程。因为除了我们常见的两个线程外,主程序也是一个线程。下面我们尝试一下传递一个参数到线程执行体中。
pthread2.c
#include <stdio.h>
#include <pthread.h>
void *thread_a(void *arg)
{
printf("thread a = %d enter/n",*(int *)arg);
}
void *thread_b(void *arg)
{
printf("thread b = %d enter/n", *(int *)arg);
}
int main(int argc, char **argv)
{
pthread_t tid_a,tid_b;
int err;
err = pthread_create(&tid_a,NULL,thread_a,(void *)&tid_a);
if(err < 0)
{
perror("pthread_create thread_a");
}
printf("create tid_a = %d/n",tid_a);
err = pthread_create(&tid_b,NULL,thread_b,(void *)&tid_b);
if(err < 0)
{
perror("pthread_create thread_a");
}
printf("create tid_b = %d/n",tid_b);
sleep(5);
printf("the main close/n");
return 0;
}
相关文章推荐
- java线程深度解析(六)——线程池技术
- unix环境高级编程-线程解析
- 一个故事贯穿线程的一生(超级直白的解析!)
- java中Thread中线程函数的解析
- java线程之start方法与run方法解析以及currentThread与this解析
- 解析Java线程同步锁的选择方法
- 线程解析(三)
- java线程深度解析(二)——线程互斥技术与线程间通信
- 深入解析Java的线程同步以及线程间通信
- java线程深度解析(三)——并发模型(Future)
- JAVA学习笔记--线程请求Json数据,并解析绑定到listView
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析
- Java 线程 sleep wait 深入解析 Thread
- 【学习笔记】【深入解析Windows操作系统(第四版)】【进程、线程】
- 线程实用解析--------(一)线程初识
- 线程实用解析---------(四)异步操作
- mesa解析1 线程本地存储 libGL.so原理
- Linux 进程与线程概念解析
- 实例解析Java中的synchronized关键字与线程安全问题
- java中线程阻塞之sleep、suspend、join、wait、resume、notify方法解析(一)