【Linux】一个简单的线程创建和同步的例子
最近很多精力在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】一个简单的线程创建和同步的例子的更多相关文章
- Linux C 一个简单的线程池程序设计
最近在学习linux下的编程,刚开始接触感觉有点复杂,今天把线程里比较重要的线程池程序重新理解梳理一下. 实现功能:创建一个线程池,该线程池包含若干个线程,以及一个任务队列,当有新的任务出现时,如果任 ...
- Linux C 实现一个简单的线程池
线程池的定义 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务.线程池线程都是后台线程.每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中.如 ...
- linux网络编程-一个简单的线程池(41)
有时我们会需要大量线程来处理一些相互独立的任务,为了避免频繁的申请释放线程所带来的开销,我们可以使用线程池 1.线程池拥有若干个线程,是线程的集合,线程池中的线程数目有严格的要求,用于执行大量的相对短 ...
- linux c编程:线程创建
前面章节中介绍了进程.从这一章开始介绍线程.进程和线程的差别是什么呢: 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实 ...
- Linux高级编程--09.线程互斥与同步
多个线程同时访问共享数据时可能会冲突,比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器 寄存器的值加1 将寄存器的值写回内存 假设两个线程在多处理器平台 ...
- Unix 环境高级编程---线程创建、同步、
一下代码主要实现了linux下线程创建的基本方法,这些都是使用默认属性的.以后有机会再探讨自定义属性的情况.主要是为了练习三种基本的线程同步方法:互斥.读写锁以及条件变量. #include < ...
- linux c学习笔记----线程创建与终止
进程原语 线程原语 描述 fork pthread_create 创建新的控制流 exit pthread_exit 从现有的控制流中退出 waitpid pthread_join 从控制流中得到退出 ...
- Java一个简单的线程池实现
线程池代码 import java.util.List; import java.util.Vector; public class ThreadPool { private static ...
- Linux一个简单的读写文件
(1)linux中的文件描述符fd的合法范围是或者一个正正数,不可能是一个负数. (2)open返回的fd程序必须记录好,以后向这个文件的所有操作都要靠这个fd去对应这个文件,最后关闭文件时也需要fd ...
随机推荐
- Oracle 全文索引相关命令
--用sys用户登录,解锁ctxsys用户alter user ctxsys account unlock; --授权给对应用户grant execute on ctx_ddl to yw; --用y ...
- 生产环境的redis高可用集群搭建
这里只是总结一下安装步骤 如果要了解redis集群高可用的原理,推荐仔细看一遍配置文件示例http://download.redis.io/redis-stable/redis.conf,源码包里也有 ...
- Highcharts AJAX JSON JQuery 实现动态数据交互显示图表 柱形图
http://my.oschina.net/xshuai/blog/345117?fromerr=hEXYMdR0 http://www.oschina.net/code/snippet_144464 ...
- Git工作流指南:Gitflow工作流 Comparing Workflows
Comparing Workflows The array of possible workflows can make it hard to know where to begin when imp ...
- redis 2.4异常
最近公司redis服务出现了异常,记录下教训: redis异常后:观察redis服务,可以看到redis cpu占用100% 用strace命令查看redis进程,显示如下: open("/ ...
- eclipse中启动tomcat报错 java.lang.ClassNotFoundException
之前启动还好好的,某次启动tomcat就莫名其妙的报了这个java.lang.ClassNotFoundException的错. 检查maven依赖包,发现这个类是存在的. 然后一通clean操作 ...
- CF-358D-Dima and Hares【T^T+*^*】
[文章标题打着转载,是因为不是自己想出来的解题,但下面的文字是自己敲的[~捂脸*>_<*~]] 题目就不贴了~~~DP+greedy的题.弱爆了看别人的代码思路过的.T^T但还是自己复述一 ...
- PowerDesigner15.1创建模型及生成带注释sql操作手册
转自:http://blog.csdn.net/huiwenjie168/article/details/7824029 一.创建模型 操作:file-->new Model… 快捷键:ctrl ...
- jxl导入/导出excel
1.jxl导入/导出excel案例,黏贴即可运行 package junit.test; import java.io.File; import java.io.IOException; import ...
- 第四讲 :hibernate中的session
hibernate中的session中可以进行增删改差,通过工具类可以得到相关的工具类. 方法概要: Transaction beginTransaction()开始一个工作单元,得到关联的事务对象 ...