线程控制知识点
我们知道创建新进程的时候会把父进程的资源复制一份到子进程里面,如果创建的进程过多,就会占用大量的系统资源,由此,诞生出了线程,线程是为了将进程的某些属性展开,作为独立的调用单位,不同时作为占有资源的基本单位。
线程是进程内的一个独立的可执行单元,一个进程至少有一个线程,也可以有多个线程,线程并不拥有资源,而是共享和使用包含它的进程所拥有的所有资源。
下面我们来了解一下线程相关的函数:
1、线程创建函数:
int pthread_create(pthread_t* thread, const pthread_attr_t *attr,void*(*start_rtn) (void*),void * arg);
参数说明:
thread: 待创建线程的id地址(指针)类型为pthread_t(长整型)
attr: 创建线程时的线程属性(暂时可忽略,NULL)
void* (*start_rtin)(void*): 返回值是void*类型的指针函数,即线程体,其参数类型为void*,即函数形式为:void * fun (void *)
arg: 传递给线程函数的参数
返回值:成功返回0,失败返回错误编号
线程创建函数包含在头文件#include <pthread.h>里面。
我们可以通过在线程里面调用 pthread_t pthread_self(void) 函数来获得当前线程的进程号。
下面是一个非常重要的线程控制函数,线程等待函数:
int pthread_join(pthread_t thread, void **retval)
pthread_join()将调用它的线程阻塞,一直等到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。第一个参数是被等待的线程标志符,第二个参数是用户定义的指针,存放被等待线程的返回值。
线程退出函数:
void pthread_exit(void *retval);
int pthread_cancel(pthread_t thread);
pthread_exit()终止调用线程,retval为线程的返回值;
pthread_cancel终止由参数thread 指定的线程。
下面是一个简单的线程编程实例:
#include <stdio.h>
#include <pthread.h>
void *thread(void)
{
printf("This is a pthread.\n");
}
int main(void)
{
pthread_t id;
int i, ret;
ret=pthread_create(&id,NULL,(void *) thread,NULL);
if (ret!=0)
{
printf ("Create pthread error!\n");
exit (1);
}
for (i=0;i<3;i++)
printf("This is the main process.\n");
pthread_join(id,NULL);
return(0);
}
下面我们了解一下线程参数传递的用法,例子:
#include <pthread.h>
#include <stdio.h>
void *create(void *arg){
//puts要求参数是char*类型,强制类型转换:
puts((char*)arg);
}
int main(int argc, char *argv[])
{
pthread_t tidp;
int error;
char* str="string from main";
error = pthread_create(&tidp, NULL, create,(void*)str);
pthread_join(tidp, NULL);
return 0;
}
我们将str作为参数传递到create线程里在里面进行强制类型转换,然后输出,这就是最简单的线程参数传递的例子。
网友评论