原文:http://blog.csdn.net/cn_wk/article/details/62236057

hello thread!

  1. 声明线程A的端口号


    #include <pthread.h> pthread_t tid;
  2. 定义线程运行函数

    void thread_function(void *args)
    {
    printf("thread_function is called!\n");
    //注意区别 cout << "thread_function is called! << endl; 和上一行
    }
  3. 创建线程

    pthread_create(&tid, NULL, &thread_function, NULL);
  4. (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++]多线程: 教你写第一个线程的更多相关文章

  1. 用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1

    package com.ljn.base; /** * @author lijinnan * @date:2013-9-12 上午9:55:32 */ public class IncDecThrea ...

  2. Java 多线程详解(五)------线程的声明周期

    Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...

  3. 网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接

    本文原作者:“水晶虾饺”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.引言 好多小白初次接触即时通讯(比如:IM或者消息推送应用)时,总是不 ...

  4. Android多线程编程<一>Android中启动子线程的方法

          我们知道在Android中,要更新UI只能在UI主线程去更新,而不允许在子线程直接去操作UI,但是很多时候,很多耗时的工作都交给子线程去实现,当子线程执行完这些耗时的工作后,我们希望去修改 ...

  5. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  6. iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

    目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,N ...

  7. 多线程的基本概念和Delphi线程对象Tthread介绍

    多线程的基本概念和Delphi线程对象Tthread介绍 作者:xiaoru    WIN 98/NT/2000/XP是个多任务操作系统,也就是:一个进程可以划分为多个线程,每个线程轮流占用CPU运行 ...

  8. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...

  9. 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 看完两篇,相信大家已经从开始的 ...

随机推荐

  1. phpStudy mysql升级至5.7

    1.先停止mysql服务,卸载原来的mysql (其他菜单-->服务器管理--->MySQL--->卸载服务) 2.下载MySQL你需要的版本 ZIP Archive 版本 3.解压 ...

  2. 【算法笔记】B1052 卖个萌

    题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805273883951104 #include <math ...

  3. HDU4641 || 6194多校 (后缀自动机-最少出现K次的字串个数 || 恰好出现K次字符串的个数)

    http://acm.hdu.edu.cn/showproblem.php?pid=4641 http://acm.hdu.edu.cn/showproblem.php?pid=6194 题意: 开始 ...

  4. 2019.04.11 第四次训练 【 2017 United Kingdom and Ireland Programming Contest】

    题目链接:  https://codeforces.com/gym/101606 A: ✅ B: C: ✅ D: ✅ https://blog.csdn.net/Cassie_zkq/article/ ...

  5. Android四种跨进程通信

    由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于andro ...

  6. Types方法之isSameType-isSuperType-isSubType

    4.isSameType() 方法 /** * Is t the same type as s? */ public boolean isSameType(Type t, Type s) { retu ...

  7. 使用github oauth 出现 OpenSSL::SSL::SSLError - SSL_connect SYSCALL returned=5 errno=0 state=SSLv2/v3 解决

    A top level initializer is highly recommended to use: conf/initializer/tls_settings.rb OpenSSL::SSL: ...

  8. 【转】WinForm窗体显示和窗体间传值

    以前对WinForm窗体显示和窗体间传值了解不是很清楚 最近做了一些WinForm项目,把用到的相关知识整理如下 A.WinForm中窗体显示 显示窗体可以有以下2种方法: Form.ShowDial ...

  9. IOS Core Image之二

    在上篇博客IOS Core Image之一中了解了下CIImage.CIFilter.CIContext三个类的使用,这篇了解下滤镜链(多滤镜)和人脸检测(不是人脸识别). 一.多滤镜 1.有些效果不 ...

  10. SQL Server讲义

    今天上班都在搞猫商品详情页的实现,回到家还在想,琅琊榜也看完了,没事做了,最近也想了解下MongoDb就复习了下大学老师当时SQL Server的讲义(真经),看了一遍还算有印象.虽然现在大部分都用O ...