Linux线程
线程是计算机中独立运行的最小单位,运行时占用很少的系统资源。由于每个线程占用的cpu时间是由系统分配的,因此可以把线程看成操作系统分配cpu时间的基本单位。在用户看来,多个线程是同时执行的,但从操作系统调度上看,各个线程是交替执行的。
这是针对单cpu单核情况,在多cpu多核的主机上,多个线程是可以同时运行的。
线程对进程优点
1.每个进程有自己独立的地址空间,而多线程同一进程内的线程共享进程的地址空间,因此创建进程需要消耗时间为其分配系统资源,节约资源
2.在系统调度方面,线程间的切换速度要远快过进程间的切换速度,节约时间
3.在通讯机制方面,同一进程内的多个线程共享数据空间,一个线程的数据可以直接提供给其它线程使用,而不必经过操作系统。因此线程间的通讯更加方便和省时。
一、创建线程
int pthread_create(pthread_t *thread,pthread_attr_t *attr, void* (start_routine)(void *), void *arg);
thread:一个指针,当线程创建成功时,用来返回创建的线程ID
attr:用于指定线程属性,NULL表示使用默认属性。
start_routine:一个函数指针,指向线程创建后要调用的函数。这个被线程调用的函数也称为线程函数。
arg:指向传递给线程函数的参数
返回值:
成功:0
二、线程终止
void pthread_exit(void *retval);
linux提供一对函数,pthread_cleanup_push()、pthread_cleanup_pop()用于自动释放资源。
从pthread_cleanup_push()的调用点到pthread_cleanup_pop()之间的程序段中的终止动作(如调用pthread_exit)都将执行pthread_cleanup_push()所指定的清理函数。
三、等待
int pthread_join(pthread_t th, void*thread_return);
函数pthread_join用来等待一个线程的结束。pthread_join的调用者将被挂起等待th线程终止,如果pthread_return不为NULL,则*thread_return=returnval。
四、代码:创建线程,等待线程结束,输出线程返回值。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void* threadOne(void *arg)
{
intk = 0;
while(1)
{
printf("threadOneon!\n");
usleep(200000);
if(k++== 10)
{
printf("threadexit!\n");
pthread_exit((void*)5);
}
}
}
int main(int argc, char **argv)
{
if(argc != 1)
{
printf("Usage:\n");
printf("<command>\n");
return1;
}
//ŽŽœšÏß³Ì
pthread_tthreadId;
if(pthread_create(&threadId,NULL, threadOne, NULL) != 0)
{
printf("threadcreate error! \n");
return1;
}
intthreadReturn;
pthread_join(threadId,(void *)&threadReturn);
if((void*)(&threadReturn) != NULL)
{
printf("threadOneclosed ok! %d \n", threadReturn);
}
return0;
}