线程解析(一)

转载 2016年08月31日 10:46:55

http://blog.chinaunix.net/uid-23770712-id-3013985.html

在使用线程之前我们要知道线程是个怎样的概念,它的作用是什么?

在学多进程或多线程编程的时候,有这样一个概念----进程是资源管理的最小单位,线程是程序执行的最小单位,相对于进程,线程上下文切换花费的开销更少。因为线程共享了内存空间,不同线程可以访问同一个变量,即多有线程都可以访问已经声明了的全局变量。在多进程中这种情况需要使用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 
        #include

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 
    #include

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;
    }

转自:http://www.embedu.org/Column/Column173.htm

java线程、线程池、xml解析入门

  • 2012年08月17日 12:08
  • 2.3MB
  • 下载

Android 线程 解析

  • 2016年06月01日 22:30
  • 3.36MB
  • 下载

linux下cpu物理个数、多核、超线程判断解析

在Linux体系中,供给了proc文件体系显示体系的软硬件信息。若是想懂得体系中CPU的供给商和相干设备信息,则可以经由过程/proc/cpuinfo文件获得。本文章针对该文件进行简单的总结。 基于...

深度解析MFC线程及机制.doc

  • 2010年03月09日 18:57
  • 12KB
  • 下载

组包(组帧)解析的实例,用线程

  • 2011年12月04日 18:49
  • 1.03MB
  • 下载

java线程深度解析(六)——线程池技术

一种最为简单的线程创建和回收的方法: new Thread(new Runnable(){ @Override public void run() { while(true) ...

java线程深入解析

  • 2012年10月30日 21:43
  • 536KB
  • 下载

Java线程知识深入解析

  • 2010年09月09日 22:33
  • 108KB
  • 下载

java线程的start和run方法解析

自定义线程两种方法 自定义一个runnable接口的实现类,然后构造一个thread,即对thread传入一个runnable接口类。 new一个thread或者写个thread子类,覆盖它的run方...

Handler解析(一):是如何实现线程之间的切换

在Android中,一般情况下(特殊情况先不说)只有UI线程才能对View进行操作,然而为了避免ANR等,耗时操作都放到子线程进行,操作完成之后再切换到UI线程,而Handler正好能够完成从子线程切...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程解析(一)
举报原因:
原因补充:

(最多只允许输入30个字)