多线程p1_线程基本操作

基本概念

什么是线程?

首先线程是包含在进程内。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,线程之间资源是共享的

多线程的优势?

如果只有一个线程,那么任务就是顺序执行的,你必须等待前面的任务完成,才能执行下一个任务。引入多线程则可以在你执行某个任务的过程中,执行其他任务。所以在耗时多任务中,应用非常广泛

代码介绍

pthread_create

简述:创建线程。

第一个参数为指向线程标识符的指针。

第二个参数用来设置线程属性

第三个参数是线程运行函数的起始地址

最后一个参数是运行函数的参数

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr, 
                   (void*)(*start_rtn)(void*),void *arg);

关于(void*)(*start_rtn)(void*)

定义了一个函数指针,名字叫start_rtn,函数的返回值是一个指针,即开头的(void *),参数也是void *指针,即最后一个void*;

最好写成

typedef void* (start_rtn)(void*),然后把start_str当成一种类型来使用;比如在这里就可以把(void*)(*start_rtn)(void*

换为start_rtn routine;(routiune是变量名,即声明了一个start_rtnl类型(函数指针类型)的变量routine)

pthread_creat函数中,这个参数用来传执行的函数地址

pthread_exit

void  pthread_exit(void  *retval);

简述:调用这个函数可以显示得退出线程

pthread_join

int pthread_join(pthread_t thread, void **retval);

简述:用来等待一个线程的结束,使一个线程等待另一个线程结束,主要于线程间同步的操作。不使用的话,该线程结束后并不会释放其内存空间,这会导致该线程变成了“僵尸线程”。

thread: 线程标识符,即线程ID,标识唯一线程

retval: 用户定义的指针

pthread_detach

简述:主线程与子线程分离,子线程结束后,资源自动回收。pthread_join()函数的替代函数。如果tid尚未终止,pthread_detach()不会终止该线程。

int pthread_join(pthread_t thread, void **retval);

举例

#include <stdio.h>   
#include <pthread.h>  
#include <time.h>
#include <windows.h>//使用Sleep的头

int g_number = 0;

#define MAX_COUNT 10000

//pthread_mutex_t mut;

void *counter3(void* args) {			//定义一个计数器counter3

	int i = 1;
	while (i <= MAX_COUNT / 4) {
		//pthread_mutex_lock(&mut);
		g_number++;
		//pthread_mutex_unlock(&mut);
		printf("hi,i am pthread 3, my g_number is [%d]\n", g_number);
		Sleep(1);// 单位ms
		i++;
	}
}

void *counter4(void* args) {			//定义一个计数器counter4
	int j = 1;
	while (j <= MAX_COUNT / 4) {
		//pthread_mutex_lock(&mut);
		g_number++;
		//pthread_mutex_unlock(&mut);
		printf("hi,i am pthread 4, my g_number is [%d]\n", g_number);
		Sleep(1);
		j++;
	}
}

int main() {
	//pthread_mutex_init(&mut, NULL);
	pthread_t t3;			//pthread_t用来声明线程id
	pthread_t t4;
	pthread_create(&t3, NULL, counter3, NULL);//调用pthread.h这个库的函数,具体上文有
	pthread_create(&t4, NULL, counter4, NULL);

	getchar();
	return 0;
}

pthread_t用来声明线程id

引出P2

为什么少加了几个?根本原因是什么?

学习多线程遇到的问题

1.回顾:指向函数的指针

语法

1.类型说明符 (*变量名)() 中间的括号是必须的 否则 int *a()就成了定义函数了

2.(*变量名)意思是首先定义为指针变量

3.()指的是,这个指针变量指向的是函数

4.类型说明符 定义的是返回值类型

赋值

刚开始声明的时候没有具体的指向,需要对变量名赋值才可以指向函数(在pthread_creat里,因为函数指针是参数,所以调用pthrea——creat会给函数指针赋值)

比如 int *a(void *b){略},我们想指向这个函数;

所以 int (*p)(),需要给p赋值a;

p=a

调用

通过指针变量调用函数只需要在应该出现函数名的地方用(*变量名代替就行了),后面的括号和实参表照原样书写

ps:当给 指向函数的指针的变量名 赋值以后

调用指向函数的指针 的时候可以用 指针变量名 直接代替 函数名,因为指针变量和函数名存的都是函数的地址

例如:y = p()或y=*p();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LiujiaHuan13

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值