最近很多精力在Linux上,今天简单看了一下Linux上的线程和同步,其实不管windows还是Linux,OS层面的很多原理和概念都是相同的,很多windows之上的经验和概念完全可以移植到Linux上。

今天用到了创建线程和一个阻塞式的线程同步函数。

用到的几个函数

#include <pthread.h>

//创建线程

int  pthread_create(

pthread_t* thread,                   /*线程标ID,   pthread_t  pthread_self(void) 可获取当前线程ID*/

pthread_attr_t* attr,              /*线程属性,如无需要可为0 */

void* (*start_routine)(void*), /*线程函数*/

void* arg                               /*线程函数参数*/

);

返回值

成功: 

失败:错误代码

//终止线程

void  pthread_exit(

void* retval   /*线程返回时带回的值,注意局部变量等问题*/

)

//阻塞式线程同步

int  pthread_join(

pthread_t  th,  /*pthread_create 函数第一个参数带回的值*/

void** thread  /*线程函数返回值,内存在此函数内部分配*/

)

//获取当前线程ID

pthread_t   pthread_self(void)

贴出代码

   /*a demo for Linux MultiThread   */
#include <iostream>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std; //thread function
void* start_routine(void* p)
{
if ( == p)
return ; size_t nLoops = *( (size_t*) p ); for (size_t i = ; i < nLoops; ++ i)
{
cout << i << endl;
usleep( * ); //800 ms
} cout << endl << "This thread ID is " << pthread_self() << endl; return ;
} int main()
{
pthread_t ptThread1;
size_t* pLoops = new size_t();
int nRet = pthread_create(&ptThread1, , start_routine, (void*)pLoops);
if ( != nRet)
cerr << endl << "create thread error!" << endl;
else
cerr << endl << "create thread successfully, return value code is " << nRet \
<< endl << "thread ID is " << ptThread1 << endl; if ( == nRet)
{
cout << endl << "wait for thread " << ptThread1 << endl;
void* pRetVal = ;
int nJoinRet = pthread_join(ptThread1, (void**)&pRetVal);
cout << endl << "thread " << ptThread1 << " finished !" << endl;
cout << "thread return value is " << (char*)pRetVal << endl;
}
cout << endl; delete pLoops;
pLoops = ; system("ls"); return ;
}

执行结果

 PS: 注意可能需要在g++编译参数上加上  -lpthread

【Linux】一个简单的线程创建和同步的例子的更多相关文章

  1. Linux C 一个简单的线程池程序设计

    最近在学习linux下的编程,刚开始接触感觉有点复杂,今天把线程里比较重要的线程池程序重新理解梳理一下. 实现功能:创建一个线程池,该线程池包含若干个线程,以及一个任务队列,当有新的任务出现时,如果任 ...

  2. Linux C 实现一个简单的线程池

    线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如 ...

  3. linux网络编程-一个简单的线程池(41)

    有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带来的开销,我们可以使用线程池 1.线程池拥有若干个线程,是线程的集合,线程池中的线程数目有严格的要求,用于执行大量的相对短 ...

  4. linux c编程:线程创建

    前面章节中介绍了进程.从这一章开始介绍线程.进程和线程的差别是什么呢: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.  线程是进程的一个实 ...

  5. Linux高级编程--09.线程互斥与同步

    多个线程同时访问共享数据时可能会冲突,比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器 寄存器的值加1 将寄存器的值写回内存 假设两个线程在多处理器平台 ...

  6. Unix 环境高级编程---线程创建、同步、

    一下代码主要实现了linux下线程创建的基本方法,这些都是使用默认属性的.以后有机会再探讨自定义属性的情况.主要是为了练习三种基本的线程同步方法:互斥.读写锁以及条件变量. #include < ...

  7. linux c学习笔记----线程创建与终止

    进程原语 线程原语 描述 fork pthread_create 创建新的控制流 exit pthread_exit 从现有的控制流中退出 waitpid pthread_join 从控制流中得到退出 ...

  8. Java一个简单的线程池实现

    线程池代码 import java.util.List; import java.util.Vector; public class ThreadPool  {     private static  ...

  9. Linux一个简单的读写文件

    (1)linux中的文件描述符fd的合法范围是或者一个正正数,不可能是一个负数. (2)open返回的fd程序必须记录好,以后向这个文件的所有操作都要靠这个fd去对应这个文件,最后关闭文件时也需要fd ...

随机推荐

  1. 在CentOS 7上给一个网卡分配多个IP地址

    有时你也许想要给一个网卡多个地址.你该怎么做呢?另外买一个网卡来分配地址?在小型网络中其实不用这么做.我们现在可以在CentOS/RHEL 7中给一个网卡分配多个ip地址.想知道怎么做么?好的,跟随我 ...

  2. iOS:Git分布式版本控制器系统

    Git的使用 1.Git简介: Git是一个开源的分布式版本控制系统.与SVN.CVS相比 分布式    不需要中心仓库 Git的版本号都是生成的一个哈希值,比如:bbaf6fb5060b4875b1 ...

  3. Ubuntu 12.04 SSH 安装

    By default Ubuntu Desktop OS comes with ssh clientpackage. It does not include ssh server package wh ...

  4. Virtualbox: Shared directory- “unknown filesystem type vboxsf”

    1. "设置”中,"共享文件夹”,把要共享的文件夹添加上. 2. 然后打开系统,找到“安装增强功能”,这时桌面上多了一个光盘或者看/media/下面是不是已经文件了,虽然这个时候可 ...

  5. Volley HTTP库系列教程(4)Volley内置的几种请求介绍及示例,StringRequest,ImageRequest,JsonObjectRequest

    Making a Standard Request Previous  Next   This lesson teaches you to Request a String 返回String Requ ...

  6. Android gingerbread eMMC booting

    Android gingerbread eMMC booting This page is currently under construction. The content of this page ...

  7. Android应用主界面底部菜单实现

    介绍 现在绝大多数主流的应用主界面,都会包含一个底部菜单,就拿腾讯的QQ与微信来说,看起来是这样的  <---我是底部菜单 原理 在很久以前,可以通过TabActivity实现相关功能,自从Fr ...

  8. Microsoft.ACE.OLEDB.12.0 错误 上传读取Excel错误

    使用"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + filePath + ";&quo ...

  9. Qt之QLabel

    简述 QLabel提供了一个文本或图像的显示,没有提供用户交互功能. 一个QLabel可以包含以下任意内容类型: 内容 设置 纯文本 使用setText()设置一个QString 富文本 使用setT ...

  10. C#基本数据类型

    在第一章我们了解了C#的输入.输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半.在你阅读完本章后,你就有足够的C#知识编写简单的程序了.但还不能使用继 ...