认识线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。线程包含了表示进程内执行环境必须的信息,其中包括进程中表示线程的线程ID、一组寄存器值、栈、调度优先级和策略、信号屏蔽字、errno常量以及线程私有数据。进程的所有信息对该进程的所有线程都是共享的,包括可执行的程序文本、程序的全局内存和堆内存、栈以及文件描述符。
在Unix和类Unix操作系统中线程也被称为轻量级进程,但轻量级进程更多指的是内核线程,而把用户线程称为线程。
"进程——资源分配的最小单位,线程——程序执行的最小单位"
需要掌握:
多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。其中,线程操作又分线程的创建,退出,等待 3 种。
互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。
条件操作有 5 种操作:创建,销毁,触发,广播和等待。其他的一些线程扩展概念,如信号灯等,都可以通过上面的三个基本元素的基本操作封装出来。
线程创建、等待及退出
需包含<pthread.h>
末尾用while卡死防止主程序执行完退出而导致线程退出。
该行while可用线程等待API替代:
pthread_join(&t1,NULL);
线程退出API使用(返回整型数)
线程退出API使用(返回字符串)
线程共享内存空间:即不同线程可以操作同一个全局变量。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
// 返回:若成功返回0,否则返回错误编号
int g_data=0;
void *func1(void *arg)
{
printf("t1:%ld thread is create\n",(unsigned long)pthread_self());
printf("t1:param is %d\n",*((int *)arg));
while(1){
printf("t1:%d\n",g_data++);
sleep(1);
if(g_data==3)//随缘达成条件,因为内存共享。=3时处于别的线程
pthread_exit(NULL);
}
}
void *func2(void *arg)
{
printf("t2:%ld thread is create\n",(unsigned long)pthread_self());
printf("t2:param is %d\n",*((int *)arg));
while(1){
printf("t2:%d\n",g_data++);
sleep(1);
}
}
int main()
{
int ret;
int param=100;
pthread_t t1;
pthread_t t2;
ret = pthread_create(&t1,NULL,func1,(void *)¶m);
if(ret==0)
{
printf("main:creat t1 success\n");
}
ret = pthread_create(&t2,NULL,func2,(void *)¶m);
if(ret==0)
{
printf("main:creat t2 success\n");
}
printf("main:%ld\n",(unsigned long)pthread_self());
while(1){
printf("main:%d\n",g_data++);
sleep(1);
}
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}