C/C++ 用 pthread 进行多线程开发

作为一个程序员,不管你用的开发语言是 C、C++、Java、Python 或者其它,你总会需要处理多任务。

多线程是实现多任务处理的一种最常用的手段,线程相比进程而言显得轻量级。

本文分享如何用 C 进行多线程开发。

核心在于 pthread 这个库。

调用 pthread_create()函数就可以创建一个线程。

它的函数原型如下:

#include <pthread.h>
extern int pthread_create (pthread_t *__restrict __newthread,
			   const pthread_attr_t *__restrict __attr,
			   void *(*__start_routine) (void *),
			   void *__restrict __arg) 

pthread.h 是它的库。

参数说明: 第一个参数是 pthread_t* 也就是代表线程实体的指针 第二个参数为了设置线程的属性,一般为 NULL 第三个参数是线程运行时的函数,这是个函数指针。 第四个参数也是一个指针,它是用来将数据传递进线程的运行函数

下面用一个代码来示例说明。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

//线程函数
void *test(void *ptr)
{
	int i;
	for(i=0;i<8;i++)
	{
		printf("the pthread running ,count: %d\n",i);
		sleep(1); 
	}

}


int main(void)
{
	pthread_t pId;
	int i,ret;
	//创建子线程,线程id为pId
	ret = pthread_create(&pId,NULL,test,NULL);
	
	if(ret != 0)
	{
		printf("create pthread error!\n");
		exit(1);
	}

	for(i=0;i < 5;i++)
	{
		printf("main thread running ,count : %d\n",i);
		sleep(1);
	}
	
	printf("main thread will exit when pthread is over\n");
	//等待线程pId的完成
	pthread_join(pId,NULL);
	printf("main thread  exit\n");

	return 0;

}

创建了名为 test.c 的文件。

这里还有一个重要的函数 pthread_join(),它的作用是挂起当前的线程,等待指定的线程运行完毕。在示例代码中主线程等待子线程执行完毕后才继续执行后面的代码。

我们现在可以编译然后执行它。

gcc -o test test.c -lpthread
./test

pthread 是一个动态库,编译的时候需要动态链接,不然程序会报错。

运行结果如下:

main thread running ,count : 0
the pthread running ,count: 0
main thread running ,count : 1
the pthread running ,count: 1
main thread running ,count : 2
the pthread running ,count: 2
main thread running ,count : 3
the pthread running ,count: 3
main thread running ,count : 4
the pthread running ,count: 4
main thread will exit when pthread is over
the pthread running ,count: 5
the pthread running ,count: 6
the pthread running ,count: 7
main thread  exit

线程与线程之间经常进行数据通讯,前面也提到过,pthread_create()最后一个参数就是用来传递数据的。

但需要特别注意的是它是 void * 的,也是就是无类型指针,这样做的目的是为了保证线程能够接受任意类型的参数,到时候再强制转换就好了。

我们简单做一些改动。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

//线程函数
void *test(void *arg)
{
	int i;
	char* name = (char *)arg;
	for(i=0;i<8;i++)
	{
		printf("the pthread %s running ,count: %d\n",name,i);
		sleep(1); 
	}

}

int main (int argc,char* argv)
{
	pthread_t pId;
	int i,ret;
	//创建子线程,线程id为pId
	ret = pthread_create(&pId,NULL,test,"sub pthread");
	
	if(ret != 0)
	{
		printf("create pthread error!\n");
		exit(1);
	}

	for(i=0;i < 5;i++)
	{
		printf("main thread running ,count : %d\n",i);
		sleep(1);
	}
	
	printf("main thread will exit when pthread is over\n");
	//等待线程pId的完成
	pthread_join(pId,NULL);
	printf("main thread  exit\n");

	return 0;

}

在线程创建的时候给子线程传递了它的名字,然后在线程的运行函数中进行了强制转换。

我们再看它编译后的运行结果。

main thread running ,count : 0
the pthread sub pthread running ,count: 0
main thread running ,count : 1
the pthread sub pthread running ,count: 1
main thread running ,count : 2
the pthread sub pthread running ,count: 2
main thread running ,count : 3
the pthread sub pthread running ,count: 3
main thread running ,count : 4
the pthread sub pthread running ,count: 4
main thread will exit when pthread is over
the pthread sub pthread running ,count: 5
the pthread sub pthread running ,count: 6
the pthread sub pthread running ,count: 7
main thread  exit

运行正常,也达到了目的。

上面是 C 的代码,其实 C++ 也同样适用,只不过需要用 g++ 编译器来编译代码。

本文介绍了简单的 C/C++ 多线程编程方法,初学者认真学习后基本可以用了。

但是,多线程最难的地方其实在于线程之间的数据共享和同步,有空的时候我会专门写一系列的文章来一一说明。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python爬虫与数据挖掘

Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程

这几天,很多朋友在群里问Scrapy安装的问题,其实问题方面都差不多,今天小编给大家整理一下Scrapy的安装教程,希望日后其他的小伙伴在安装的时候不再六神无主...

8930
来自专栏Soul Joy Hub

特定用户QQ群聊天记录导出的实现

这里要注意 : 导出之后的 文本是 unicode 编码的,需要转换 ==|| 之前不知道,搞了大半天。

15930
来自专栏字根中文校对软件

C++/CLI 简单介绍

托管的C++(MC++)饱受诟病的一个地方就是语法格式和普通的编程语言差别很大,很多人都评价为: ugly 和 twisted 语法。

14340
来自专栏字根中文校对软件

g++ 编译 c++ 程序时需要包括 include .h 文件,还是需要 .cpp 文件

g++ 编译 c++ 程序时需要包括 include .h 文件,还是需要 .cpp 文件 最近用Eclipse 下的cdt...

20320
来自专栏腾讯技术工程官方号的专栏

大牛书单 | 春节特辑

? 导读:读书,伴随技术人的一生。技术人通过读书增长见闻、精进技术,提升人生境界。18年农历春节,我们特别邀请腾讯安全平台部总经理coolc、腾讯优图实验室主...

29380
来自专栏TheOneGIS空间站

LeetCode-Palindromic Substrings

Given a string, your task is to count how many palindromic substrings in this st...

12170
来自专栏字根中文校对软件

C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第二部分

回到和语言相关的问题,我现在还是想说说LINQ。微软 Visual Stuido .NET 的产品经理 Tony Goodhew 在一次访谈中说过,微软的研究表...

12130
来自专栏Python爬虫与数据挖掘

Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程

这几天,很多朋友在群里问Scrapy安装的问题,其实问题方面都差不多,今天小编给大家整理一下Scrapy的安装教程,希望日后其他的小伙伴在安装的时候不再六神无主...

10520
来自专栏TheOneGIS空间站

LeetCode-Longest Palindromic Subsequence

这是LeetCode的第516道题目:516. Longest Palindromic Subsequence。

12550
来自专栏字根中文校对软件

google 和 unixlite 的设计理念

    昨天 feng.you 给我这条信息:the google legacy。   http://www.cincomsmalltalk.com/us...

9020

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励