[C++]多线程: 教你写第一个线程
原文:http://blog.csdn.net/cn_wk/article/details/62236057
hello thread!
声明线程A的端口号
#include <pthread.h> pthread_t tid;定义线程运行函数
void thread_function(void *args)
{
printf("thread_function is called!\n");
//注意区别 cout << "thread_function is called! << endl; 和上一行
}创建线程
pthread_create(&tid, NULL, &thread_function, NULL);(optional)阻塞: 挂起当前线程,直到tid线程结束
pthread_join(tid, NULL);
好了,这样就可以启一个线程了,完整代码如下:
#include<unistd.h>
#include<stdio.h>
#include<cstring>
#define MAX_THREAD 2 pthread_t thread[MAX_THREAD];
pthread_mutex_t mut; int num = ;
void* thread1(void *args)
{
printf("hi, I am thread1\n");
for(int i=; i < ; i++){
pthread_mutex_lock(&mut);
printf("[thread1]num=%d, i=%d\n", num, i);
num ++;
pthread_mutex_unlock(&mut);
sleep();
}
pthread_exit(NULL);
} void* thread2(void *args)
{
printf("hi, I am thread2\n");
for(int i = ; i < ; i++)
{
pthread_mutex_lock(&mut);
printf("[thread2]num=%d, i=%d\n", num, i);
num ++;
pthread_mutex_unlock(&mut);
sleep();
}
pthread_exit(NULL);
} void thread_create()
{
memset(&thread, , sizeof(thread));
if( !=pthread_create(&thread[], NULL, thread1, NULL))
printf("thread1 create faild\n");
else
printf("thread1 established\n"); if( != pthread_create(&thread[], NULL, thread2, NULL))
printf("thread2 create faild\n");
else
printf("thread2 established\n"); } void thread_wait()
{
if( != thread[])
{
pthread_join(thread[], NULL);
printf("thread 1 is over\n");
} if( != thread[])
{
pthread_join(thread[], NULL);
printf("thread 2 is over\n");
}
} int main()
{
pthread_mutex_init(&mut, NULL);
printf("main thread: creating threads...\n");
thread_create();
printf("main thread: waiting threads to accomplish task...\n");
thread_wait();
return ;
}
代码,得到结果:
tmain thread: creating threads…
thread1 established
hi, I am thread1
[thread1]num=0, i=0
thread2 established
main thread: waiting threads to accomplish task…
hi, I am thread2
[thread2]num=1, i=0
[thread1]num=2, i=1
[thread2]num=3, i=1
[thread1]num=4, i=2
[thread2]num=5, i=2
[thread1]num=6, i=3
[thread1]num=7, i=4
[thread2]num=8, i=3
[thread1]num=9, i=5
[thread2]num=10, i=4
thread 1 is over
[thread2]num=11, i=5
[thread2]num=12, i=6
[thread2]num=13, i=7
[thread2]num=14, i=8
[thread2]num=15, i=9
thread 2 is over
OK,现在说一下pthread_create方法的原型
pthread_create方法
作用
- 创建线程
原型
```
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg);
```
参数
- 第一个参数是指向线程标识符的指针
- 第二个参数用来设置线程的属性
- 第三个参数是线程运行函数的首地址
- 第四个参数是线程运行函数的参数
返回值
- 若成功,则返回0;否则,返回错误编号。
pthread_join方法
作用
- 这个函数是一个线程阻塞的函数
- 等待线程结束再继续往下执行,要不然主进程和下面的线程并行执行
原型
extern int pthread_join __P ((pthread_t __th, void **__thread_return))
参数
- 第一个参数是被等待线程的标识符
- 第二个参数是用户自定义的指针。用来存储被等待线程的返回值
[C++]多线程: 教你写第一个线程的更多相关文章
- 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1
package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...
- Java 多线程详解(五)------线程的声明周期
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
- 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接
本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...
- Android多线程编程<一>Android中启动子线程的方法
我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用
目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,N ...
- 多线程的基本概念和Delphi线程对象Tthread介绍
多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...
- 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)
唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...
- 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取
版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 看完两篇,相信大家已经从开始的 ...
随机推荐
- shiro原理及其运行流程介绍
shiro原理及其运行流程介绍 认证执行流程 1.通过ini配置文件创建securityManager 2.调用subject.login方法主体提交认证,提交的token 3.securityMan ...
- win10 安装 mysql 5.7
win10 安装 mysql 5.7 1.在mysql 官网下载mysql 5.7 的手动安装包 mysql--winx64.zip 2. 解压到mysql 目录的文件夹下面 D:\moudle\my ...
- python之守护进程
主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了. 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束后就终止 其二 ...
- 我也学习JAVA多线程-join
在工作中,挺少遇到join关键字,但很多多线程资料和面试过程中,初中级开发工程师总会遇到join. 今天一起学习下join. join的作用:等待指定的时间(当为0时,一直等待),直到这个线程执行结束 ...
- javascript中的抽象相等==与严格相等===
1.数据类型:String,Number,Boolean,Object,Null,Undefined 2.抽象相等:x==y A.两者数据类型相同:typeof x == typeof y a.Str ...
- applets
Java Applet 可以大大提高Web页面的交互能力和动态执行能力.包含Applet的网页被称为Java-powered页,可以称其为Java支持的网页. Applet 当用户访问这样的网页时,A ...
- 我爱Markdown (1)
作为一个程序员,用Word, Excel等写技术文档实在是不那么方便.而我,作为一个Unix/Linux程序员,写技术文档还是喜欢用Wiki等在线写作工具.虽然Wiki已经很酷了,但跟Markdown ...
- 剑指offer(21-25)编程题
栈的压入.弹出序列 从上往下打印二叉树 二叉搜索树的后序遍历序列 二叉树中和为某一值的路径 复杂链表的复制 21.输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假 ...
- vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制
一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...
- PgAdmin4连接数据库报错:Unable to connect to server: ERROR: unrecognized configuration parameter "bytea_output"
原因: PgAdmin 4不再支持PostgreSQL 9.0 和更早的版本 我的版本是8.2.15 template1=# select version(); version ----------- ...