目录
3、创建及销毁互斥锁pthread_mutex_init()、pthread_mutex_destroy()
4、加锁及解锁pthread_mutex_lock()、pthread_mutex_unlock()
3、销毁条件变量pthread_cond_destroy()
线程和进程的区别:
进程是程序执行时的一个实例,是担当分配系统资源(CPU时间、内存等)的基本单位,还是线程的容器。
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
第一种方法:
一个进程在运行的时候,要给他分配内存,要维护它的数据段和代码段以及堆栈等等,而线程是跟进程共享这些东西,开辟多个线程不会分配新的内存,和进程相比,它是一种非常"节俭"的多任务操作方式。
第二种方法:
1.根本区别:进程是操作系统进行资源分配的最小单元,线程是操作系统进行运算调度的最小单元。
2.从属关系不同:进程中包含了线程,线程属于进程。
3.开销不同:进程的创建、销毁和切换的开销都远大于线程。
4.拥有资源不同:每个进程有自己的内存和资源,一个进程中的线程会共享这些内存和资源。
5.控制和影响能力不同:子进程无法影响父进程,而子线程可以影响父线程,如果主线程发生异常会影响其所在进程和子线程。
6.CPU利用率不同:进程的CPU利用率较低,因为上下文切换开销较大,而线程的CPU的利用率较高,上下文的切换速度快。
7.操纵者不同:进程的操纵者一般是操作系统,线程的操纵者一般是编程人员。
Linux线程开发常用API
一、线程相关API
1、线程的创建pthread_create()
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
pthread_t *thread: pthread是一个指针参数,传出线程ID
const pthread_attr_t *attr: 用于指定线程属性,传入NULL表示使用默认属性
void *(*start_routine) (void *): 是个函数指针,是线程的主控函数
void *arg: 是第三个函数的参数,要强制转换成泛型(void*)然后进行值
传递即可,不能传递地址
返回值:若成功返回0,否则返回错误编号
2、线程的等待pthread_join()
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
pthread_t thread: thread是我们要等待退出的线程的线程ID
void **retval: retval是传出参数,用于获取线程的退出值,即,pthread_exit里的那个参数
在使用该函数时要注意retval参数:
(1) 一定要用void**强制转换为泛型指针
(2)该函数是将pthread_exit里的退出值 复制到 retval所指向的位置。
(3)该参数可以置为NULL,表示不需要获取线程退出值。
3、线程的退出pthread_exit()
#include <pthread.h>
void pthread_exit(void *retval);
void *retval: retval表示线程的退出值,我们必须将该参数强转为泛型void*
举例,实现线程创建退出
#include<stdio.h>
#include<pthread.h>
void *func1(void * arg){
// static int ret=10;
static char *ret="t1 is run out";
printf("t1: %ld thread is creat\n ",(unsigned long)pthread_self());
printf("t1: param is %d\n",*((int *)arg));
pthread_exit((void *)ret);
}
int main(){
int param=100;
int ret;
//int *pret=NULL;//传一个整形参数给phread_join
char *pret=NULL;//传一个字符串参数给phread_join
pthread_t t1;
ret=pthread_create(&t1,NULL,func1,(void *)¶m);
if(ret == 0){
printf("main:thread craet success\n");
}
printf("main: %ld\n ",(unsigned long)pthread_self());
// while(1);
pthread_join(t1, (void**)&pret);
// printf("main t1 quit %d\n",pret);
printf("main t1 quit %s\n",pret);
return 0;
}