手机版
你好,游客 登录 注册
背景:
阅读新闻

C++跨平台技术 - 线程Thread

[日期:2014-06-13] 来源:Linux社区  作者:iamshaofa [字体: ]

跨平台是什么意思呢?先了解一下平台的概念以及平台的差异。我们知道一个VC编译出来的*.exe是不能在Linux运行的,不能运行的原因可以概括为以下几个方面:

1. 文件的结构与格式

可执行程序是按定义好的格式来组织的, Microsoft 他 GNU对程序文件的定义是不一样的,如GNU使用 ELF格式定义。也就是说,当操作系统(Windows/Linux)试图把一个程序文件加载到内存里准备运行的时候,它可能会发现这个文件格式不对。

2. 依赖库

程序的最基本的运行库是C runtime,比如你调用的printf就是C库的接口,这间味着你发布的程序是依赖C的动态库的, Linux上叫libc.so

3. 指令集与大小端

最常见的指令集用Intel, ARM 指令集,如果你的程序是为Intel PC编译的,那么这个程序就不可能在ARM平台上运行。(也许它们都是运行着Linux)。但是指令集都不一样的话,怎么能够运行呢?

通过上面的讨论,可以发现跨平台好像是一件不能完成的任务。那么为什么我们还能经常见到跨平台这个词呢,Java, ACE ,QT等等,它们都是跨平台的。那么它们是怎么跨平台的呢?

C++11新特性:Lambda函数(匿名函数) http://www.linuxidc.com/Linux/2013-12/93367p2.htm

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm

读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm

读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm

C++11 获取系统时间库函数 time since epoch http://www.linuxidc.com/Linux/2014-03/97446.htm

C++11中正则表达式测试 http://www.linuxidc.com/Linux/2012-08/69086.htm

第一种跨平台的方式:JAVA

首先说JAVA。JAVA这个东西跨平台最彻底,同时也可以说它最“不跨平台”。JAVA编译出来的class文件并不能直接在目标平台上运行,它必须由一个叫java.exe /java的程序解释执行。显然,在不同的平台上这个java解释程序是完全不一样的。最基本的,windows上的解释程序叫java.exe,linux上的叫java,是完全不的两个文件。这件事说白了就是,你写一个脚本,交给2个不同的程序去运行,运行结果一致。

如果对比一下,连perl, Python这种脚本语言也是跨平台的。它们和JAVA“跨”的方式本质上一样。Java跨的方式更隐蔽一些,它是先把 .java文件编译成了中间指令集.class,再解释执行这个中间指令集的。

第二种跨平台的方式: 仿QT

我就直接说我们可以怎么跨平台吧。简单地说,就是写2个平台相关的代码,屏蔽了平台差异。在业务代码里,完全不要用平台相关的代码。

以线程为例,windows/linux下实现线程的方式是完全不一样的。于是我们先定义一个线程类。

#ifndef _OSAPI_THREAD_H
#define _OSAPI_THREAD_H

/* presented by 阿发你好 */
class OS_Thread
{
public:
 OS_Thread();
 virtual ~OS_Thread();

 // 创建并启动
 virtual int Run();

 // 等待和收回资源
 static void Join(OS_Thread* thrd);

 // Sleep函数
 static void Msleep(int ms);
 static void Sleep(int s);

public:
 virtual int Routine() = 0;

private:
 void* m_Priv;
};


#endif

也就是说,无论你是XXX平台还是YYY平台,总该是有线程支持的。所以麻烦你先按照上述接口实现一个线程类吧。我在业务代码里要使用线程的时候,就使用线程接口,完全不使用平台相关的接口了。

#include "../osapi/Thread.h"


class MyThread : public OS_Thread
{
public:
 int Create()
 {
  m_quitflag = false;
  run();
  return 0;
 }
 
 void Destroy()
 {
  m_quitflag = true;
  Join(this);
 }

private:
 /* 线程函数 */
 virtual int Routine()
 {
  while(!m_quitflag)
  {
      printf("helloafa!\n");
   OS_Thread::msleep(500);
  }
  return 0;
 }
 
private:
 bool m_quitflag;
};

更多详情见请继续阅读下一页的精彩内容http://www.linuxidc.com/Linux/2014-06/103104p2.htm

linux
相关资讯       C++  Thread线程 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款