线程管理(基本概念)

进程与线程

程序中的一个执行路线就叫做线程(thread)。线程是“一个进程内部的控制序列”,一个进程中最少有一个线程。进程是资源竞争的基本单位,而线程是程序执行的基本单位,一个进程中的多个线程共享进程数据,但也有自己的数据。

线程管理(基本概念)_第1张图片

进程中线程的共享数据与私有数据

共享:代码段,数据段,文件描述符,信号。

私有:线程ID,寄存器,栈,程序计数器,errno。

线程管理(基本概念)_第2张图片

创建进程与线程的区别

线程管理(基本概念)_第3张图片

进程:当一个进程执行一个fork调用的时候,会创建出进程的一个新拷贝,新进程将拥有它自己的变量和它自己的PID。这个新进程的运行时间是独立的,它在执行时几乎完全独立于创建它的进程。

线程:在进程里面创建一个新线程的时候,新的执行线程会拥有自己的堆栈(因此也就有自己的局部变量),但要与它的创建者共享全局变量、文件描述符、信号处理器和当前的工作目录状态。

线程竞争范围

操作系统提供了各种模型,用来调度应用程序创建的线程。这些模型之间的主要不同是:在竞争系统资源(特别是CPU时间)时,线程调度竞争范围不一样。

进程竞争范围:各个线程在同一进程竞争“被调度的CPU时间”。

系统竞争范围:线程直接和“系统范围”内的其他线程竞争。

线程函数

#include 
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
创建一个新的线程
void pthread_exit(void *retval);

线程终止

int pthread_join(pthread_t thread, void **retval);

等待线程结束

pthread_t pthread_self(void);

返回线程ID

int pthread_cancel(pthread_t thread);

取消一个线程

int pthread_detach(pthread_t thread);

将一个线程从进程中分离

代码实例

#include
#include
#include
#include
typedef struct data
{
    int num;

} Data;
void *func(void *arg)
{
    Data *p=(Data*)arg;
    printf("coming into thread ,id is %u the num is %d\n",pthread_self(),p->num);
    p->num=30;
    pthread_exit(arg);
}
int main(int argc,char* argv[])
{
    pthread_t t;
    Data s;
    s.num=10;
    pthread_create(&t,NULL,func,&s);
    Data *ptr=NULL;
    sleep(5);
    pthread_join(t,&ptr);
    printf("new num is %d",ptr->num);
    return 0;
}

你可能感兴趣的:(Apue/Unp)