线程

线程管理
线程的概念:
线程是进程内部的一条执行序列(执行流),每个进程至少有一条执行序列:main的执行体。进程可以通过线程库创建N条线程,这些新创建的线程称之为函数线程,main函数所代表的线程为主线程。线程在进程内部共享地址空间、打开的文件描述符、全局变量等资源。同时线程也有其私有的数据信息,包括:线程号、寄存器(程序计数器和堆栈指针)、堆栈、信号掩码、优先级、线程私有存储空间。
引入线程的原因:
线程是一种非常”节俭”的多任务操作方式。
线程间方便的通信机制。
提高应用程序响应。
使多cpu系统更加有效。操作系统会保证当线程数不大于cpu数目时,不同的线程运行于不同的cpu上。
改善程序结构。
线程与进程的区别:
进程是资源分配的最小单位,线程是CPU调度的最小单位
线程是轻量级的进程
管理方式不同,进程是PCB管理,线程是由线程结构TCB管理
线程实现的三种方式:
用户级  n:1
  在用户空间可以看到n条线程,但在内核空间只能看到一条线程
内核级 n:n
在用户空间可以看到n条线程,在内核空间也可以看到n条线程
混合模式  n:m
在用户空间可以看到n条线程,分成m组,在内核空间可以看到m条线程
线程的创建: (线程库文件的使用)pthread.h
如果在主线程里面创建线程,程序就会在创建线程的地方产生分支,变成两个部分执行。
创建出来的函数线程不同与函数调用,函数调用是这条执行流中的一部分。函数线程是创建出来的一条独立的执行序列,它与主线程同时执行。
Int  pthread_create(pthread_t *id,pthread_attr_t  *attr,void *(*fun)(void *),void *arg);
Id:是一个指针,当线程成功创建时,返回创建线程id
attr:用于指定线程的属性
fun:该参数是一个函数指针,指向线程创建后要调用的函数
arg:传递给线程函数的参数
成功返回0
包含线程创建函数的源代码要想生成可执行文件,必须
gcc   -o  pthread  pthread.c   -lpthread
线程结束:
通过return从线程函数返回
2、Int  pthread_exit(void *);
参数可以设置线程结束状态。
需要注意的是:主线程中如果从main函数返回或是调用了exit函数退出主线程,则整个进程终止,此时所有的其他线程也将终止。另一种是,如果主线程调用pthread_exit函数则仅仅是主线程消亡,进程不会结束,其他线程也不会结束,直到所有的线程都结束时,进程才结束。
等待线程结束:
Int  pthread_join(thread_t id,void **);
可以获取到等待的线程通过pthread_exit设置的结束状态信息,并且释放该线程所占的资源。
调用该函数的进程将挂起,等待id所表示的线程结束。
Void**是指向线程id返回值的指针
线程函数传参:
将值强转成void*
  Int a=(int)arg;
将地址强转成void*
Int a=*(int *)arg;

线程同步:
多线程访问临界资源时
互斥锁:
通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。
Int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);
Int pthread_mutex_lock(pthread_mutex_t  *mutex);
Int pthread_mutex_destroy(pthread_mutex_t  *mutex);
Int pthread_mutex_unlock(pthread_mutex_t   *mutex);
读写锁  自旋锁
条件变量
  利用线程间共享的全局变量进行同步的一种机制
Int pthread_cond_init(pthread_cond_t*cond,const pthread_condattr_attr_t *cond_attr);
Int pthread_mutex_lock(pthread_mutex *mutex);
Int pthread_mutex_destroy(pthread_mutex *mutex);
Int pthread_mutex_unlock(pthread_mutex *mutex);
信号量
sem_init()
Int sem_wait()
sem

练习:
创建函数线程,主线程完成对数组元素的排序,函数线程完成打印100以内的素数。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void Primer()
{
int i=2;
for(;i<=100;i++)
{
int count=0;
int j=1;
for(;j<=i;j++)
{
if(i%j==0)
{
count++;
}
}
if(count==2)
{
printf("%d ",i);
}
}
printf("\n");
}

int main()
{
pthread_t id;
int res=pthread_create(&id,NULL,Primer,NULL);
assert(res==0);
int arr[5]={3,7,4,8,2};
int m=0;
for(;m<5;m++)
{
int tmp=0;
int n=m+1;
for(;n<5;n++)
{
if(arr[m]<arr[n])
{
tmp=arr[m];
arr[m]=arr[n];
arr[n]=tmp;
}
}
}
int k=0;
for(;k<5;k++)
{
printf("arr[%d]=%d\n",k,arr[k]);
}
pthread_exit(NULL);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值