线程简介
线程
1.线程是操作系统运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
2.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程
并行执行不同的任务。
3.线程是独立调度和分派的基本单位,线程可以为操作系统内核调度的内核线程,或者由内
核与用户进程,行混合调度。
4.同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和
信号处理等等,但同一进程中的多个线程有各自的调用栈,寄存器环境,线程本地存储。
5.一个进程可以有很多线程,每条线程并行执行不同的任务。
线程属性
1.轻型实体:线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立
运行的资源。
2.独立调度和分派的基本单位:在多线程OS中,线程是能独立运行的基本单位,也是独立
调度和分派的基本单位。线程的切换非常迅速且开销小。
3.可并发执行:一个进程中的多个线程之间,可并发执行,允许在一个进程中所有线程都能
并发执行;不同进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并
行工作的能力。
4.共享进程资源:同一进程中的各个线程,都可以共享该进程所拥有的资源。所有线程
都具有相同的地址空间同一个进程内的线程共享内存和文件,所以线程之间互相通信
不必调用内核。
线程与进程的区别
1.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程
在其它进程不可见。
2.通信:进程间通信IPC,线程间可以直接读写进程数据段。
3.调度和切换:线程上下文切换比进程上下文切快。
4.在多线程OS中,进程不是一个可执行的实体。
线程相关函数
线程创建
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
参数:
pthread_t *thread:pthread_t类型的指针变量,也可以地址。
const pthread_attr_t *attr:建线程的属性,一般为NULL。
void *(*start_routine) (void *):线程的操作函数,返回值的类型为void *类型。
void *arg:函数的实参,无传递数据时,arg为NULL。
返回值:
成功执行返回0
线程退出
void pthread_exit(void *retval);
参数:
void **retval:线程结束的返回值,是阻塞的函数。
线程回收
int pthread_join(pthread_t thread, void **retval);
参数:
thread:线程
retval:收集线程退出的返回值
返回值:
成功返回0
线程锁
创建锁
pthread_mutex_t mutex;
初始化锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
销毁锁
pthread_mutex_destory(&mutex);
线程加锁
pthread_mutex_lock(&mutex);
线程解锁
pthread_mutex_unlock(&mutex);
参数:
mutex:锁
attr:锁的属性
1:PTHREAD_MUTEX_TIMED_NP:attr为NULL,线程加锁后,其他请求锁
的线程将形成一个等待队列,并在解锁后按照优先级获得锁。
2:PTHREAD_MUTEX_RECURSIVE_NP:一个线程对同一个锁成功
lock多次,并通过多次解锁,不同线程请求,解锁时竞争。
3:PTHREAD_MUTEX_ERRORCHECK_NP:一个线程请求同一锁,则返
回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。
4:PTHREAD_MUTEX_ADAPTIVE_NP适应锁,最简单的锁类型,仅等待解
锁后重新竞争。
线程等待
创建
pthread_cond_t cond;
线程等待
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);
参数:
abstime:绝对时间
struct timeval {
time_t tv_sec; //秒
suseconds_t tv_usec; //微妙
}
返回值:
成功返回0
线程激发
广播激发所有等待
int pthread_cond_broadcast(pthread_cond_t *cond);
信号激发指定线程
int pthread_cond_signal(pthread_cond_t *cond);
demo1:
创建线程,接收并打印线程结束标志,标志为hello word(字符串)或 10(int)
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *func(void *param)
{
//static int value = 100;
static char *buf = "hello world";
printf("param : %d\n",*((int *)param));
printf("thread pid : %ld\n",(unsigned long)pthread_self());
//pthread_exit((void *)&value);
pthread_exit((void *)buf);
}
void result()
{
pthread_t t;
int param;
int ret;
//int *retvalue = NULL;
char *retvalue = NULL;
param = 10;
ret = pthread_create(&t,NULL,func,(void *)¶m);
if(ret == 0)
{
printf("pthread create sucess\n");
printf("main thread pid :%ld\n",(unsigned long)pthread_self());
pthread_join(t,(void **)&retvalue);
//printf("thread over sign : %d\n",*retvalue);
printf("thread over sign : %s\n",retvalue);
}
}
int main()
{
result();
return 0;
}
结果示例:
demo2:
线程1,2加锁保证线程在执行锁内的程序时,不会被打扰
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t mutex;
void *func1(void *param)
{
pthread_mutex_lock(&mutex);
int num = 0;
printf("t1 pthread pid : %ld\n",(unsigned long)pthread_self());
for(num = 0;num < 5;num++)
{
printf("%d\n",(*((int *)param))++);
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *func2(void * param)
{
pthread_mutex_lock(&mutex);
printf("t2 pthread pid : %ld\n",(unsigned long)pthread_self());
int n;
for(n = 0;n < 5;n++)
{
printf("%d\n",(*((int *)param))++);
}
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void result()
{
pthread_t t1;
pthread_t t2;
int param;
param = 10;
printf("main pthread pid : %ld\n",(unsigned long)pthread_self());
pthread_mutex_init(&mutex,NULL);
pthread_create(&t1,NULL,func1,(void *)¶m);
pthread_join(t1,NULL);
pthread_create(&t2,NULL,func2,(void *)¶m);
pthread_join(t2,NULL);
pthread_mutex_destroy(&mutex);
}
int main()
{
result();
return 0;
}
结果示例:
demo3:
编写程序,每隔三秒,线程1给线程2发送信号,线程2开始运行
代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex;
pthread_cond_t con;
int i;
void *func1(void * param)
{
while(1)
{
pthread_cond_wait(&con,&mutex);
printf("t1 is running\n");
i = 0;
}
}
void *func2(void * param)
{
while(1)
{
pthread_mutex_lock(&mutex);
i++;
printf("%d\n",i);
pthread_mutex_unlock(&mutex);
if(i == 3)
{
printf("t1 start runing\n");
pthread_cond_signal(&con);
}
sleep(1);
}
}
void result()
{
pthread_t t1;
pthread_t t2;
int param;
param = 10;
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&con,NULL);
pthread_create(&t1,NULL,func1,(void *)¶m);
pthread_create(&t2,NULL,func2,(void *)¶m);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&con);
}
int main()
{
result();
return 0;
}
结果示例: