一、多线程的概念及程序实现
1.什么是多线程?
线程:(LWP)线程是轻量级的进程,进程是资源分配的最小单位,线程是调度的最小单位。(同一个进程下)线程共用同一个进程的资源。多线程在切换的时候要比多进程切换的时候效率高。多进程的安全性要比多线程的安全性高,因为进程资源相互独立,线程的资源相关共享(当前进程)。线程在创建的时候几乎不需要内存空间,只是占用了状态和指向正在执行内存的指针的资源。
在使用线程的时候需要安装man手册:sudo apt-get install manpages-posix manpages-posix-dev
2.多线程创建(第三方库函数)
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:在进程中创建线程 -pthread 或 -lpthread
#include <pthread.h>
参数:
@thread:线程号
@attr:NULL,使用默认属性
@start_routine:线程体
void *task (void *arg)
{
}
@arg:向线程体传参
返回值:成功返回0,非0就是失败
pthread_t pthread_self(void);
功能:在当前线程内获取线程号
#include <pthread.h>
返回值:成功返回线程号,不会失败
示例:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void *task(void *arg)
{
//这是线程体
printf("这是我创建的第一个线程tid = %ld\n",pthread_self());
}
int main(int argc, char const *argv[])
{
pthread_t tid;
//注意:这里的tid不能用于接受返回值,因为返回值不是线程号
//成功返回0,失败返回非零
//tid只能通过形参来接收
if((pthread_create(&tid,NULL,task,NULL))!=0){
fprintf(stderr,"pthread create error\n");
exit(EXIT_FAILURE);
}
printf("这是主线程 = %ld\n",tid);
while(1);
return 0;
}
3.多线程执行过程及顺序
时间片轮询,上下文切换
注:线程间如果有全局变量的话,它们共用同一块内存空间,就没有写时拷贝的机制了。
示例:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
int num=10;
void *task(void *arg)
{
//这是线程体
printf("这是我创建的第一个线程tid = %ld\n",pthread_self());
while(1){
printf("i am thread...\n");
sleep(1);
}
//在线程中不能使用exit或_exit,因为它们会让进程结束,只要进程一结束所有的线程都退出
//return不会结束一个进程,可以结束线程
// exit(0);
return NULL;
}
int main(int argc, char const *argv[])
{
pthread_t tid;
if((pthread_create(&tid,NULL,task,NULL))!=0){
fprintf(stderr,"pthread create error\n");
exit(EXIT_FAILURE);
}
printf("这是主线程 = %ld\n",tid);
while(1){
printf("i am process,num = %d\n",num++);
sleep(1);
}
return 0;
}
4.线程的退出
void pthread_exit(void *retval);
功能:退出一个线程(进程是不会结束)
#include <pthread.h>
参数:
@retval:退出的状态
示例:
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
int num=10;
void *task(void *arg)
{
//这是线程体
printf("这是我创建的第一个线程tid = %ld\n",pthread_self());
while(1){
printf("i am thread num = %d\n",num++);
sleep(1);
pthread_exit(NULL);
}
}
int main(int argc, char const *argv[])
{
pthread_t tid;
if((pthread_create(&tid,NULL,task,NULL))!=0){
fprintf(stderr,"pthread create error\n");
exit(EXIT_FAILURE);
}
printf("这是主线程 = %ld\n",tid);
while(1){
printf("i am process num = %d\n",num++);
sleep(1);
}
return 0;
}
5.给线程发信号
int pthread_cancel(pthread_t thread);
功能:取消一个线