原文: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. 厉害了,七牛云 CEO 来讲架构了!

    说起许式伟,你应该不陌生,他是七牛云的CEO,ECUG 社区发起人,国内 Go 语言圈的领军人物,曾就职于金山.盛大,有超过 10 年的搜索和分布式存储相关技术的研发经验. 他的个人经历颇为传奇,大学 ...

  2. 防止过拟合:L1/L2正则化

    正则化方法:防止过拟合,提高泛化能力 在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合).其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在tr ...

  3. 北航操作系统实验2019:Lab4-1流程梳理

    北航操作系统实验2019:Lab4-1流程梳理 前言 操作系统的实验课实在令人头秃.我们需要在两周时间内学习相关知识.读懂指导书.读懂代码.补全代码.处理玄学bug和祖传bug,以及回答令人窒息的思考 ...

  4. 关于MatlabGUI清除WorkSpace的用法

    近日在调试Matlba GUI程序时,因为不想退出程序后手动Clear All来清理,又需要在过程中对WorkSpace进行清理,否则会引用之前的结果导致错误,找了很多资料,国内的论坛什么的都说用Cl ...

  5. win2003设置单用户登录

    远程桌面是windows操作系统中一个很方便的功能,管理测试机资产.异地排除故障等,都很快捷.在windows xp sp2模式下,一般默认是单用户登录,也就是当A用户远程一台机器时,B用户在远程到这 ...

  6. 用Python写了一个postgresql函数,感觉很爽

    用Python写了一个postgresql函数,感觉很爽 CREATE LANGUAGE plpythonu; postgresql函数 CREATE OR REPLACE FUNCTION myfu ...

  7. Docker 拷贝文件

    1.从容器里面拷文件到宿主机? 答:在宿主机里面执行以下命令 docker cp 容器名:要拷贝的文件在容器里面的路径       要拷贝到宿主机的相应路径 示例: 假设容器名为testtomcat, ...

  8. java处理数据库的CRUD

    package com.lhy.jdbc.util; import java.sql.Connection; import java.sql.PreparedStatement; import jav ...

  9. Idea查看代码相关技巧

    (1)查看类中的属性与方法快捷键  Alt+7 (2)查看方法被调用 在方法上右键find usages (3)查看方法说明  Ctrl+Q

  10. java代理-cglib

    前面说到了java的动态代理,但是动态代理依赖于接口,这次来看看cglib来实现的代理... 假设有如下方法,这回没有说接口哦~ package proxy.cglibProxy; public cl ...