C语言中的多线程编程
很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单、方便、强大。下面就让我们简单领略一下Unix C语言环境下的多线程编程吧!
下面先看一个简单的单线程程序:
/* 06.3.6
Sghello.c
Hello,world -- Single Thread
*/
#include
#define NUM 6
int main()
{
void print_msg(char*);
print_msg("hello,");
print_msg("world!");
}
void print_msg(char* m)
{
int i;
for(i=;i
{
printf("%s",m);
fflush(stdout);
sleep();
}
}
下图反映了程序的执行流程:
执行结果:
$ ./sghello.exe
hello,hello,hello,hello,hello,hello,world!world!world!world!world!world! 那么如果想同时执行两个对于print_msg函数的调用,就想使用fork建立两个新的进程一样,那该怎么办?这种思想清楚的体现在下图:
那么怎么才能达到这种效果呢?
我们可以使用函数pthread_create创建一个新的线程。
函数原型:
int pthread_create(pthread_t *thread,
pthread_attr_t *attr,
void *(*func)(void*),
void *arg);
参数: thread 指向pthread_t类型变量的指针
attr 指向pthread_attr_t类型变量的指针,或者为NULL
func 指向新线程所运行函数的指针
arg 传递给func的参数
返回值 成功返回
errcode 错误
我们可以使用函数pthread_join等待某进程结束。
函数原型:int pthread_join(pthread_t thread,void ** retval);
参数: thread 所等待的进程
retval 指向某存储线程返回值的变量
返回值: 成功返回
errorcode 错误
以上两个函数都包含在头文件pthread.h中。
下面请看多线程版的Hello,world!
/* 06.3.6
Mhello1.c
Hello,world -- Multile Thread
*/
#include
#include
#define NUM 6
int main()
{
void print_msg(void*); pthread_t t1,t2;
pthread_create(&t1,NULL,print_msg,(void *)"hello,");
pthread_create(&t2,NULL,print_msg,(void *)"world!\n"); pthread_join(t1,NULL);
pthread_join(t2,NULL);
}
void print_msg(void* m)
{
char *cp=(char*)m;
int i;
for(i=;i
{
printf("%s",m);
fflush(stdout);
sleep();
}
}
运行结果:
$ gcc mhello1.c -o mhello1.exe
$ ./mhello1.exe
hello,world!
hello,world!
hello,world!
hello,world!
hello,world!
hello,world! C语言有一次拓展了我的视野,多线程的问题还有很多,像线程间的分工合作、使用互斥机制保证线程间数据的安全共享、使用条件变量同步线程间的数据传输、传递多个参数给线程等,若读者有兴趣,可自行深入。
推荐《Understanding Unix/Linux Programming》
C语言中的多线程编程的更多相关文章
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
		上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ... 
- Java中的 多线程编程
		Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ... 
- Python中的多线程编程,线程安全与锁(二)
		在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ... 
- Go语言中的并发编程
		并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天) ... 
- Qt中的多线程编程
		http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ... 
- .NET 4中的多线程编程之一:使用Task(转载)
		原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ... 
- 每天进步一点点——论fork()函数与Linux中的多线程编程
		转载请说明出处:http://blog.csdn.net/cywosp/article/details/27316803 一.fork()函数 在操作系统的基本概念中进程是程序的一次运行,且是 ... 
- C语言使用pthread多线程编程(windows系统)二
		我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ... 
- Python中的多线程编程,线程安全与锁(一)
		1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ... 
随机推荐
- 网上搜到的权限系统demo
			网上搜到的权限系统demo http://www.sojson.com/shiro 
- Web开发笔记 #08# Jackson组合多个对象的属性构成JSON(以及添加自定义属性)
			参考文档:https://github.com/FasterXML/jackson-databind 关于ObjectMapper的线程安全 截自官方文档: 组合多个对象的属性构成JSON(以及添加自 ... 
- Access is denied (user is anonymous); redirecting to authentication entry point
			Access is denied (user is anonymous); redirecting to authentication entry point org.springframework. ... 
- SVN的标准目录结构
			SVN目录规范 在visualSVN中创建仓库时,可以选择svn目录结构 Trunk主干目录,此目录下的文件为基准文件. Brancher 用于开发的分支目录 Tags用于发布的版本目录 假设有一个项 ... 
- linux+apache+nginx实现,反向代理动静分离
			在我们开发的过程中,一定会遇到,负载均衡方面的问题.下面我们,做一个小例子:使用nginx+apache实现反向代理,动静分离. 这里apache.php.nginx的安装就不做赘述了,不懂的朋友可以 ... 
- 让CSS某行不失效
			比如百度的分享代码 <div id="bdshare" class="bdshare_t bds_tools get-codes-bdshare"> ... 
- 为什么call比apply快
			这是一个非常有意思的问题. 在看源码的过程中,总会遇到这样的写法: var triggerEvents = function(events, args) { var ev, i = -1, l = e ... 
- tomcat部署maven web项目
			tomcat上部署maven web项目的三种方法 1.将maven项目打成war包,然后放到tomcat容器中发布: 2.在IDE工具中部署tomcat,然后使用远程部署方式部署本地maven项目: ... 
- HihoCoder 1636 Pangu and Stones(区间DP)题解
			题意:合并石子,每次只能合并l~r堆成1堆,代价是新石堆石子个数,问最后能不能合成1堆,不能输出0,能输出最小代价 思路:dp[l][r][t]表示把l到r的石堆合并成t需要的最小代价. 当t == ... 
- 【做题】agc008f - Black Radius——计数&讨论&思维
			原文链接 https://www.cnblogs.com/cly-none/p/9794411.html \[ \newcommand{\stif}[2]{\left[ \begin{matrix} ... 
 
			
		
