C++开发基础之异步编程模式

1.前言

异步编程模式是现代C++开发中不可或缺的一部分。在处理IO密集型或者长时间运行的任务时,异步编程可以提高程序的响应性和吞吐量。异步编程模式通常适用于以下场景:

1. 需要执行耗时的 I/O 操作:例如读取文件、数据库操作、网络请求等,这些操作通常需要花费较长时间。如果使用同步方法,程序将会被阻塞,无法响应其他操作。而使用异步编程模式,可以在这些操作执行过程中继续处理其他任务,从而提高程序的并发性能和响应能力。

2. 需要执行计算密集型操作:虽然异步编程通常与 I/O 操作相关联,但它也可以用于执行计算密集型操作,例如图像处理、科学计算等。在这种情况下,异步编程可以帮助程序更好地利用多核处理器等硬件资源,加快计算速度。

3. 需要处理大量的并发请求:例如 Web 服务器、消息队列等,这些应用程序需要同时处理大量的请求,如果采用同步方式,程序将无法满足高并发的需求。而使用异步编程模式,可以充分利用系统资源,提高并发性能和可扩展性。

2.异步编程模式

  1. 回调函数(Callbacks):
    回调函数是异步编程最基本的形式之一。当一个操作完成后,它会调用一个预定义的回调函数来通知程序,以便继续执行其他操作。在C++中,回调函数可以使用函数指针、std::function或者Lambda表达式来定义。

  2. Future/Promise:
    Future/Promise是一种更高级别的异步编程模式,它允许程序等待异步操作完成并获取结果。在C++中,可以使用std::future和std::promise来实现Future/Promise模式。

  3. 协程(Coroutines):
    协程是一种轻量级的线程,它可以在同一线程内切换上下文并暂停/恢复执行。它可以用于实现高效的异步编程和状态机。在C++20中,协程已经成为了语言的一部分,并且可以使用co_await关键字来等待异步操作的完成。

  4. 异步/await(C++20):
    异步/await是一种与协程相关的模式,它允许程序以自然的顺序编写异步代码。在C++20中,可以使用co_await关键字来等待异步操作的完成,并使用co_return关键字来返回异步操作的结果。

  5. 线程池(Thread Pool):
    线程池是一种常见的并发模式,它可以提高程序的性能和资源利用率。一个线程池包含多个线程,在程序需要执行异步操作时,可以将任务提交到线程池中,以便在其中的一个线程上执行。在C++中,可以使用std::thread或者第三方库来实现线程池。

  6. Actor 模型:
    Actor模型是一种基于消息传递的并发模型,它允许多个独立的Actor同时运行,并通过消息进行通信。每个Actor都拥有自己的状态和行为,并且可以响应接收到的消息。在C++中,可以使用第三方库来实现Actor模型。

  7. Reactive Extensions:
    Reactive Extensions是一种基于事件流的编程模型,它允许程序以声明性的方式处理数据流。在C++中,可以使用rxcpplib或者其他第三方库来实现Reactive Extensions。

  8. 数据流处理框架:
    数据流处理框架是一种基于管道和过滤器的编程模型,它允许程序以可组合的方式处理数据流。在C++中,可以使用rxcpp或者其他第三方库来实现数据流处理框架。

3.各个模式特点

以下是C++开发中常见的异步编程模式,这些模式各有特点,可以根据具体需求选择适合的模式。

序号异步编程模式描述优势缺点适用场景学习曲线平台支持可读性性能
1回调函数(Callbacks)通过回调函数来处理异步操作完成后的结果和错误直接,易于理解可能导致回调地狱(callback hell),难以维护较简单的异步操作通用一般一般
2Future/Promise使用future对象获取异步操作的结果,promise对象设置结果直观,支持等待异步操作完成对于复杂的控制流较难处理单个异步操作的结果通用较好一般
3协程(Coroutines)使用协程来简化异步代码,避免回调地狱简化异步代码,易于编写和理解需要特定的编译器支持,不是标准的C++特性处理复杂的异步流程部分平台支持较好较好
4异步/await(C++20)使用co_await关键字来等待异步操作的完成简化异步代码,易于编写和理解C++20新特性,不是所有平台和编译器都支持新项目或有C++20支持的项目部分平台支持较好较好
5线程池(Thread Pool)使用线程池管理异步任务的执行,提高并发性能有效利用系统资源,降低线程创建和销毁开销需要合理调整线程池大小,可能出现任务处理不均衡高并发环境通用一般较好
6Actor 模型使用独立的“actor”对象处理消息和并发操作易于实现并发和消息传递,避免共享数据的竞争可能引入复杂性,需要谨慎处理消息顺序分布式和并发密集型应用程序通用一般一般
7Reactive Extensions使用可观察序列来处理异步事件和数据流强大的组合和转换操作,支持响应式编程范式学习曲线较陡,理解响应式编程概念较难响应式和事件驱动的应用程序部分平台支持较好较好
8数据流处理框架使用数据流处理框架(如RxCpp、Boost.Asio)来处理异步流数据提供丰富的数据处理操作符和工具学习成本较高,需要熟悉框架的特性复杂的数据流处理需求部分平台支持较好较好

4.各个示例程序

对每种异步编程模式的简要示例代码说明:

1. 回调函数(Callbacks)示例代码:

#include <iostream>
#include <functional>

void async_operation(std::function<void(int)> callback) {
    // 模拟异步操作
    int result = 42;
    callback(result);
}

int main() {
    async_operation([](int result) {
        std::cout << "异步操作完成,结果为: " << result << std::endl;
    });

    return 0;
}

输出结果

异步操作完成,结果为: 42

2. Future/Promise 示例代码:

在这里插入图片描述

#include <iostream>
#include <future>

int async_operation() {
    // 模拟异步操作
    return 42;
}

int main() {
    std::future<int> future_result = std::async(std::launch::async, async_operation);

    int result = future_result.get();
    std::cout << "异步操作完成,结果为: " << result << std::endl;

    return 0;
}

输出结果

异步操作完成,结果为: 42

3. 协程(Coroutines)示例代码:

#include <iostream>
#include <coroutine>

struct Task {
    struct promise_type {
        Task get_return_object() {
            return Task{std::coroutine_handle<promise_type>::from_promise(*this)};
        }
        std::suspend_never initial_suspend() { return {}; }
        std::suspend_never final_suspend() noexcept { return {}; }
        void return_value(int value) { result = value; }
        void unhandled_exception() {}
        
        int result;
    };

    std::coroutine_handle<promise_type> coro;

    Task(std::coroutine_handle<promise_type> h): coro(h) {}
    ~Task() { if (coro) coro.destroy(); }
};

Task async_operation() {
    co_return 42;
}

int main() {
    Task task = async_operation();
    std::cout << "异步操作完成,结果为: " << task.coro.promise().result << std::endl;

    return 0;
}

输出结果

异步操作完成,结果为: 42

4. 异步/await(C++20)示例代码:

#include <iostream>
#include <future>

std::future<int> async_operation() {
    // 模拟异步操作
    return std::async(std::launch::async, []() {
        return 42;
    });
}

int main() {
    auto future_result = async_operation();
    int result = future_result.get();
    std::cout << "异步操作完成,结果为: " << result << std::endl;

    return 0;
}

输出结果

异步操作完成,结果为: 42

5. 线程池(Thread Pool)示例代码:

在这里插入图片描述

#include <iostream>
#include <thread>
#include <vector>
#include <queue>
#include <mutex>
#include <condition_variable>

class ThreadPool {
public:
    ThreadPool(size_t num_threads) {
        for (size_t i = 0; i < num_threads; ++i) {
            threads.emplace_back([this] {
                while (true) {
                    std::function<void()> task;
                    {
                        std::unique_lock<std::mutex> lock(queue_mutex);
                        condition.wait(lock, [this] { return stop || !tasks.empty(); });
                        if (stop && tasks.empty()) {
                            return;
                        }
                        task = std::move(tasks.front());
                        tasks.pop();
                    }
                    task();
                }
            });
        }
    }

    template<class F>
    void enqueue(F&& f) {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            tasks.emplace(std::forward<F>(f));
        }
        condition.notify_one();
    }

    ~ThreadPool() {
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            stop = true;
        }
        condition.notify_all();
        for (std::thread& thread : threads) {
            thread.join();
        }
    }

private:
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> tasks;
    std::mutex queue_mutex;
    std::condition_variable condition;
    bool stop = false;
};

int main() {
    ThreadPool pool(4);

    for (int i = 0; i < 8; ++i) {
        pool.enqueue([i] {
            std::cout << "任务 " << i << " 在线程池中执行" << std::endl;
        });
    }

    return 0;
}

输出结果

任务 0 在线程池中执行
任务 1 在线程池中执行
任务 2 在线程池中执行
任务 3 在线程池中执行
任务 4 在线程池中执行
任务 5 在线程池中执行
任务 6 在线程池中执行
任务 7 在线程池中执行

6. Actor 示例代码:

#include <iostream>
#include <thread>
#include <queue>
#include <mutex>

class Actor {
public:
    void sendMessage(int message) {
        std::lock_guard<std::mutex> lock(mutex);
        messages.push(message);
    }

    void processMessages() {
        while (!messages.empty()) {
            int message = messages.front();
            messages.pop();
            std::cout << "接收到消息: " << message << std::endl;
        }
    }

private:
    std::queue<int> messages;
    std::mutex mutex;
};

int main() {
    Actor actor;

    std::thread producer([&actor] {
        for (int i = 0; i < 5; ++i) {
            actor.sendMessage(i);
            std::this_thread::sleep_for(std::chrono::seconds(1));
        }
    });

    std::thread consumer([&actor] {
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
        actor.processMessages();
    });

    producer.join();
    consumer.join();

    return 0;
}

输出结果

接收到消息: 0
接收到消息: 1
接收到消息: 2
接收到消息: 3
接收到消息: 4

7. Reactive Extensions 示例代码:

#include <iostream>
#include <vector>
#include <chrono>
#include <thread>
#include "rx.hpp"

using namespace rxcpp;
using namespace rxcpp::sources;
using namespace rxcpp::operators;
using namespace rxcpp::util;

int main() {
    std::vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    auto observable = from(nums) // 创建可观察序列
        .filter([](int n) { return n % 2 == 0; }) // 过滤偶数
        .map([](int n) { return n * n; }) // 将每个数平方
        .subscribe_on(rx::serialize_new_thread()) // 在新线程上执行上述操作
        .observe_on(rx::observe_on_event_loop()); // 切回主线程

    observable.subscribe([](int n) { std::cout << n << " "; }); // 订阅序列并输出

    std::this_thread::sleep_for(std::chrono::seconds(1)); // 等待异步操作完成

    std::cout << std::endl;

    return 0;
}

使用 subscribe_on() 操作符将序列的创建、过滤和映射操作切换到一个新的线程上执行。然后,使用 observe_on() 操作符将结果切换回主线程,并在主线程上订阅序列,并输出结果

4 16 36 64 100

8. 数据流处理框架 示例代码:

#include <iostream>
#include "rx.hpp"

using namespace rxcpp;
using namespace rxcpp::sources;
using namespace rxcpp::operators;
using namespace rxcpp::util;

int main() {
    // 创建一个整数序列
    auto values = rxcpp::observable<>::range(1, 10);

    // 对序列进行转换和过滤操作
    auto result = values
        .filter([](int n) { return n % 2 == 0; }) // 过滤偶数
        .map([](int n) { return n * n; }); // 平方

    // 订阅结果并输出
    result.subscribe(
        [](int v) { std::cout << v << " "; },
        []() { std::cout << "onCompleted" << std::endl; }
    );

    return 0;
}

使用 rxcpp::observable<>::range() 创建一个整数序列,从1到10。然后,我们使用 filter() 操作符过滤掉所有奇数,再使用 map() 操作符将剩余的偶数平方。最后,我们订阅了这个序列,并在每个值被发出时输出它的值。

这段代码演示了如何使用rxcpp来处理数据流,包括创建可观察序列、对序列进行转换和过滤操作,以及订阅结果并处理每个值。通过这种方式,我们能够以可组合的方式处理数据流,实现更加灵活和高效的数据处理逻辑。

输出结果

4 16 36 64 100 onCompleted

5. 参考文档

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书是一本介绍利用Visual C++进行网络通信程序开发的书籍,书中精选了大量网络实例,涵盖了本地计算机网络编程,局域网网络通信编程,IE编程,网络通信协议编程,串口通信编程,代理服务器编程和高级网络通信编程。每个工程实例都提供了完整的源代码,读者可以很容易地根据需要进行二次开发。本书适合进行网络通信开发的人员阅读,同时也可以作为科研单位,高校相关专业人员的参考书籍。<br><br>目录介绍<br>第1章 Visual C++网络通信编程基础 1<br>1.1 Winsock1.1编程技术 1<br>1.1.1 Winsock的基本概念 1<br>1.1.2 Winsock的编程特点 2<br>1.1.3 Winsock基本的API 2<br>1.1.4 Winsock的异步模式 7<br>1.1.5 面向连接协议和无连接协议 20<br>1.2 Winsock 2.0编程技术 21<br>1.2.1 Winsock 2.0技术说明 21<br>1.2.2 Winsock 2.0新增函数 25<br>1.2.3 Winsock网络程序——聊天室 26<br>1.3 CAsyncSocket编程技术 38<br>1.3.1 CAsyncSocket类的组成 38<br>1.3.2 CAsyncSocket编程模型 39<br>1.4 CSocket编程技术 41<br>1.4.1 CSocket类的组成 42<br>1.4.2 CSocket应用实例——聊天室 43<br>1.5 WinInet编程技术 52<br><br>第2章 本地计算机网络编程 57<br>2.1 获取计算机的名称和IP地址 57<br>2.2 获取计算机的子网掩码 60<br>2.3 获取计算机的DNS设置 62<br>2.4 获取计算机的网卡地址 63<br>2.5 获取计算机安装的协议 65<br>2.6 获取计算机提供的服务 67<br>2.7 获取计算机的所有网络资源 69<br>2.8 修改本地计算机的网络设置 70<br>2.9 获取计算机TCP/IP的所有信息 74<br><br>第3章 局域网网络通信编程实例 79<br>3.1 获取网上邻居 79<br>3.1.1 实现原理 80<br>3.1.2 实例实现 83<br>3.2 IP地址和主机名之间的转换 87<br>3.2.1 实现原理 87<br>3.2.2 实例实现 89<br>3.3 映射网络驱动器 93<br>3.3.1 实现原理 93<br>3.3.2 实例实现 95<br>3.4 局域网消息发送程序Net Send 97<br>3.4.1 实现原理 98<br>3.4.2 实例实现 101<br>3.5 获取局域网内其他计算机的信息 103<br><br>第4章 IE编程实例 111<br>4.1 简单的浏览器的实现 111<br>4.1.1 实现原理 111<br>4.1.2 实例实现 112<br>4.2 删除IE相关历史记录 116<br>4.2.1 实现原理 116<br>4.2.2 实例实现 117<br>4.3 将应用程序加入到IE工具栏 121<br>4.3.1 实现原理 122<br>4.3.2 实例实现 123<br>4.4 超级链接的实现 127<br>4.4.1 实现原理 127<br>4.4.2 实例实现 128<br>4.5 禁止IE的弹出窗口 132<br>4.5.1 实现原理 132<br>4.5.2 实例实现 133<br>4.6 禁止浏览某些网站 139<br>4.6.1 实现原理 139<br>4.6.2 实例实现 139<br>4.7 IE收藏夹 142<br>4.7.1 实现原理 142<br>4.7.2 实例实现 142<br>4.8 设置桌面快捷方式和活动桌面 145<br>4.8.1 实现原理 145<br>4.8.2 实例实现 146<br><br>第5章 基本网络编程实例 150<br>5.1 点对点文件传输 150<br>5.2 端口扫描程序 155<br>5.2.1 实现原理 155<br>5.2.2 实例实现 155<br>5.3 Finger编程 161<br>5.3.1 实现原理 162<br>5.3.2 实例实现 164<br>5.4 Sniff编程 166<br>5.4.1 实现原理 166<br>5.4.2 实例实现 167<br>5.5 Internet文件下载 178<br>5.5.1 实现原理 178<br>5.5.2 实例实现 180<br><br>第6章 网络通信协议编程实例 184<br>6.1 FTP协议 185<br>6.1.1 FTP工作原理 185<br>6.1.2 FTP数据表示 186<br>6.1.3 FTP命令 187<br>6.1.4 FTP应答 192<br>6.1.5 FTP客户端实例方法 194<br>6.1.6 FTP客户端实例实现 201<br>6.2 SMTP协议 221<br>6.2.1 SMTP会话 221<br>6.2.2 SMTP信件 225<br>6.2.3 SMTP客户端实例方法 232<br>6.2.4 SMTP客户端实例实现 233<br>6.3 POP3协议 259<br>6.3.1 POP3会话 259<br>6.3.2 POP3信件 264<br>6.3.3 POP3客户端实例方法 268<br>6.3.4 POP3客户端实例实现 268<br>6.4 ICMP协议 287<br>6.4.1 ICMP报文格式 287<br>6.4.2 ICMP时间戳请求与应答 289<br>6.4.3 Ping程序的实现 291<br>6.4.4 TraceRoute程序的实现 300<br>6.5 Telnet协议 308<br>6.5.1 Telnet协议 308<br>6.5.2 NVT ASCII字符集 309<br>6.5.3 协商选项 309<br>6.5.4 BBS实例实现 310<br>6.6 HTTP协议 323<br>6.6.1 HTTP会话 324<br>6.6.2 HTTP数据 329<br>6.6.3 HTTP客户端程序的实现 329<br>6.6.4 HTTP服务器实例实现 343<br><br>第7章 Modem/串口通信编程实例 353<br>7.1 AT命令 353<br>7.1.1 Modem状态 353<br>7.1.2 AT命令 354<br>7.1.3 Modem返回信息码 354<br>7.2 MSCOMM控件编程实例 355<br>7.2.1 实现原理 355<br>7.2.2 实例实现 356<br>7.3 串口通信API编程实例 360<br>7.3.1 打开和关闭串口 360<br>7.3.2 串口配置 362<br>7.3.3 串口属性设置 365<br>7.3.4 缓冲区控制 366<br>7.3.5 串口读写 367<br>7.3.6 通信事件 369<br>7.3.7 设备控制命令 370<br>7.3.8 实例实现 370<br><br>第8章 代理服务器编程实例 378<br>8.1 Socks 5协议编程 379<br>8.1.1 实例原理 386<br>8.1.2 实例实现 388<br>8.2 HTTP代理服务器实例 397<br>8.2.1 主框架代码分析 397<br>8.2.2 代理类CProxyServer的实现 399<br><br>第9章 高级实例解析 409<br>9.1 串口通信高级编程实例 409<br>9.1.1 主程序结构和流程 409<br>9.1.2 实例演示 409<br>9.1.3 实例原理 410<br>9.1.4 实例设计 414<br>9.1.5 代码分析 414<br>9.2 网络流量监控实例 425<br>9.2.1 主程序结构和流程 426<br>9.2.2 实例演示 426<br>9.2.3 实例原理 426<br>9.2.4 实例设计 428<br>9.2.5 代码分析 429<br>9.3 网站下载实例 438<br>9.3.1 主程序结构和流程 438<br>9.3.2 实例演示 438<br>9.3.3 实例原理 439<br>9.3.4 实例设计 441<br>9.3.5 代码分析 442<br>9.4 网络五子棋实例 458<br>9.4.1 主程序结构和流程 458<br>9.4.2 实例演示 458<br>9.4.3 实例原理 459<br>9.4.4 实例设计 459<br>9.4.5 代码分析 459<br>9.5 语音聊天实例 466<br>9.5.1 主程序结构和流程 467<br>9.5.2 实例演示 467<br>9.5.3 实例原理 468<br>9.5.4 实例设计 472<br>9.5.5 代码分析 473<br>9.6 远程控制实例 482<br>9.6.1 主程序结构和流程 482<br>9.6.2 实例演示 483<br>9.6.3 实例原理 484<br>9.6.4 实例设计 485<br>
【适合小白入门】深入掌握Windows操作系统原理,提升程序开发水平,为学习驱动开发,内核安全打下基础。学完本课程可以轻松的理解Windows内核,开阔思路,对没有底层开发基础的人起到有非常好的指导作用。在此基础上可以开发出有趣且功能强大的软件。 课程目录: 第1章windows驱动基础 第一课 认识windows驱动 第二课 在虚拟机里安装windows操作系统 第三课 windows操作系统基本概念 第四课 操作系统的分层结构 第2章windowsw驱动编译环境配置、安装及调试 第五课 安装驱动开发环境 第六课 安装驱动开发环境 第七课 实战:编写驱动程序加载器 第3章驱动程序的基本结构 第八课 复习c语言的指针和数据结构 第九课 windows驱动程序的基本结构 第十课 编程实战-创建设备对象 第4章windows内存管理 第十一课 内存管理操作 第十二课 驱动开发中使用链表 第十三课 驱动开发中使用快查表 第十四课 在驱动中使用c++中内存管理操作-newdelet 第十六课 驱动开发中宏与断言的使用 第5章应用程序与驱动程序通信 第二十六课 irp与派遣函数 第二十七课 缓冲区读写操作 第十五课 在驱动中使用结构化异常处理 第二十八课 缓冲区读写操作 第二十九课 模拟文件 第三十课 直接方式与其它方式读写操作 第三十一课 io设备控制操作 第三十二课 io设备控制操作 第6章windows内核函数 第十七课 内核模式下的字符串操作1 第十八课 内核模式下的字符串操作 第十九课 内核模式下的字符串操作 第二十课 内核模式下的文件操作 第二十一课 内核模式下的文件操作 第二十二课 内核模式下注册表操作 第二十三课 内核模式下注册表操作 第二十四课 内核模式下注册表操作 第二十五课 内核模式下注册表操作 第7章驱动程序的同步处理 第三十三课 内核模式下的同步与异步操作 第三十四课 用户模式下的同步对象1_事件 第三十五课 用户模式下的同步对象2_线程信号量与互斥体 第三十六课 内核模式下的同步对象3_系统线程创建与普 第三十七课 内核模式下的同步对象4_信号量与互斥体 第三十八课 内核模式与用户模式间的同步操作 第三十九课 其它内核同步要素 第8章IRP的同步与异步 第四十课 应用程序的对文件同步与异步操作 第四十一课 irp异步完成 第四十二课 irp的取消与startio函数 第四十三课 自定义startio函数 第9章定时器54分钟3节 第四十四课 io定时器与dpc定时器 第四十五课 内核模式下的等待操作 第四十六课 时间函数与irp超时处理 第10章驱动程序调用驱动程序1小时3节 第四十七课 通过设备句柄调用驱动程序 第四十八课 设备指针调用驱动程序 第四十九课 自定义irp与ObReferenceObject 第11章分层过滤驱动 第五十课 分层驱动:枚举设备栈上的设备对象 第五十一课 编写过滤驱动程序 第五十二课 irp完成函数 第12章驱动程序开发高级技能 第五十三课 驱动程序的兼容性 第五十五课 驱动调试之windbg与vmware 第五十六课 驱动调试vs vmware 第五十四课 驱动签名证书原理及制作 第五十七课 驱动调试神器virtualkd 第五十八课 汇编语言编写驱动之环境搭建 第五十九课 用汇编语言开发32与64位驱动程序
标准c库大全:C++标准库介绍 疯狂代码 http://CrazyCoder.cn/ ĵ:http:/CrazyCoder.cn/VC/Article12860.html   标准库中提供了C基本设施虽然C标准库随着C标准折腾了许多年直到标准出台才正式定型但是在标准库实 现上却很令人欣慰得看到多种实现并且已被实战证明为有工业级别强度佳作 1、Dinkumware C Library 参考站点:http://www.dinkumware.com/ P.J. Plauger编写高品质标准库P.J. Plauger博士是Dr. Dobb\'s设计杰出奖获得者其编写库长期被Microsoft采 用并且最近Borland也取得了其OEMlicense在其C/C产品中采用Dinkumware库 2、RogueWave Standard C Library 参考站点:http://www.roguewave.com/ 这个库在Borland C Builder早期版本中曾经被采用后来被其他库给替换了笔者不推荐使用 3、SGI STL 参考站点:http://www.roguewave.com/ SGI公司C标准模版库 4、STLport 参考站点:http://www.stlport.org/ SGI STL库跨平台可移植版本 C各大有名库介绍——准标准库Boost   Boost库是个经过千锤百炼、可移植、提供源代码C库作为标准库后备是C标准化进程发动机的 Boost库由 C标准委员会库工作组成员发起在C社区中影响甚大其成员已近2000人 Boost库为我们带来了最新、最酷、最 实用技术是不折不扣“准”标准库 Boost中比较有名气有这么几个库: Regex 正则表达式库 Spirit LL parser framework用C代码直接表达EBNF Graph 图组件和算法 Lambda 在地方定义短小匿名对象很实用functional功能 concept check 检查泛型编程中concept Mpl 用模板实现元编程框架 Thread 可移植C多线程库 Python 把C类和映射到Python的中 Pool 内存池管理 smart_ptr 5个智能指针学习智能指针必读份不错参考是来自CUJ文章: Smart Poers in Boost,哦这篇文章可以查到CUJ是提供在线浏览中文版见笔者在Dr.Dobb\'s Journal软件 Software研发杂志第7辑上译文   Boost总体来说是实用价值很高质量很高库并且由于其对跨平台强调对标准C强调是编写平台无关现代C开 发者必备工具但是Boost中也有很多是实验性质东西在实际开发中实用需要谨慎并且很多Boost中库功能堪称对 语言功能扩展其构造用尽精巧手法不要贸然花费时间研读Boost另外面比如Graph这样库则是具有工业强度结构 良好非常值得研读精品代码并且也可以放心在产品代码中多多利用 参考站点:http://www.boost.org C各大有名库介绍——GUI   在众多C库中GUI部分库算是比较繁荣也比较引人注目在实际开发中GUI库选择也是非常重要件事情下面我 们综述下可选择GUI库各自特点以及相关工具支持 1、MFC   大名鼎鼎微软基础类库(Microsoft Foundation Class)大凡学过VC人都应该知道这个库虽然从技术角度讲 MFC是不大漂亮但是它构建于Windows API 的上能够使员工作更容易,编程效率高减少了大量在建立 Windows 时必须编写代码同时它还提供了所有般 C 编程优点例如继承和封装MFC 编写在各个版本 Windows操作系统上是可移植例如在Windows 3.1下编写代码可以很容易地移植到 Windows NT 或 Windows 95 上但是在最近发展以及官方支持上日渐势微[Page] 2、QT 参考网站WebSite:http://www.trolltech.com   Qt是Trolltech公司个多平台C图形用户界面应用框架它提供给应用开发者建立艺术级图形用户界面所需所 用功能Qt是完全面向对象很容易扩展并且允许真正地组件编程自从1996年早些时候Qt进入商业领域它已经成 为全世界范围内数千种成功应用基础Qt也是流行Linux桌面环境KDE 基础同时它还支持Windows、Macosh、 Unix/X11等多种平台 3、WxWindows 参考网站WebSite:http://www.wxwindows.org   跨平台GUI库其类层次极像MFC所以有文章介绍从MFC到WxWindows代码移植以实现跨平台功能通过多 年开发也是个日趋完善GUI库支持同样不弱于前面两个库并且是完全开放源代码新近C Builder XGUI设计器就 是基于这个库 4、Fox 参考网站WebSite:http://www.fox-toolkit.org/   开放源代码GUI库作者从自己亲身开发经验中得出了个理想GUI库应该是什么样子感受出发从而开始了对 这个库开发有兴趣可以尝试下 5、WTL   基于ATL个库使用了大量ATL轻量级手法模板等技术在代码尺寸以及速度优化方面做得非常到位主要面向 使用群体是开发COM轻量级供网络下载可视化Control控件开发者 6、GTK 参考网站WebSite:http://gtkmm.sourceforge.net/   GTK是个大名鼎鼎C开源GUI库在Linux世界中有Gnome这样杀手应用而Qt就是这个库C封装版本 C各大有名库介绍——网络通信 1、ACE 参考网站WebSite:http://www.cs.wustl.edu/~schmidt/ACE.html   C库代表超重量级网络通信开发框架ACE自适配通信环境(Adaptive Communication Environment)是可 以自由使用、开放源代码面向对象框架在其中实现了许多用于并发通信软件Software核心模式ACE提供了组丰 富可复用C包装外观(Wrapper Facade)和框架组件可跨越多种平台完成通用通信软件Software任务其中包括:事 件多路分离和事件处理器分派、信号处理、服务化、进程间通信、共享内存管理、消息路由、分布式服务动态 (重)配置、并发执行和同步等等 2、StreamModule 参考网站WebSite:http://www.omnarious.org/StrMod   设计用于简化编写分布式库尝试着使得编写处理异步行为更容易而不是用同步外壳包起异步本质 3、SimpleSocket 参考网站WebSite:http://home.hetnet.nl/~lcbokkers/simsock.htm   这个类库让编写基于客户/服务器更加容易 4、A Stream Socket API for C 参考网站WebSite:http://www.pcs.cnu.edu/~dgame/s/sC/s.html   又个对Socket封装库 C各大有名库介绍——XML 1、Xerces 参考网站WebSite:http://xml.apache.org/xerces-c/   Xerces-C 是个非常健壮XML解析器它提供了验证以及SAX和DOM APIXML验证在文档类型定义 (Document Type DefinitionDTD)方面有很好支持并且在2001年12月增加了支持W3C XMLSchema 基本完整 开放标准 2、XMLBooster[Page] 参考网站WebSite:http://www.xmlbooster.com/   这个库通过产生特制parser办法极大提高了XML解析速度并且能够产生相应GUI来修改这个parser在 DOM和SAX两大主流XML解析办法的外提供了另外个可行解决方案 3、Pull Parser 参考网站WebSite:http://www.extreme.indiana.edu/xgws/xsoap/xpp   这个库采用pull思路方法parser在每个SAXparser底层都有个pullparser这个xpp把这层暴露出来直接给大 家使用在要充分考虑速度时候值得尝试 4、Xalan 参考网站WebSite:http://xml.apache.org/xalan-c/   Xalan是个用于把XML文档转换为HTML纯文本或者其他XML类型文档XSLT处理器 5、CMarkup 参考网站WebSite:http://www.firstobject.com/xml.htm   这是种使用EDOMXML解析器在很多思路上面非常灵活实用值得大家在DOM和SAX的外寻求点灵感 6、libxml http://libxmlplusplus.sourceforge.net/   libxml是对著名libxml XML解析器C封装版本 C各大有名库介绍——科学计算 1、Blitz 参考网站WebSite:http://www.oonumerics.org/blitz   Blitz 是个高效率数值计算库它设计目是希望建立套既具像C 样方便同时又比Fortran速度更快数值计算环 境通常用C所写出数值比 Fortran慢20%左右因此Blitz正是要改掉这个缺点思路方法是利用Ctemplate技术执行 甚至可以比Fortran更快   Blitz目前仍在发展中对于常见SVDFFTsQMRES等常见线性代数思路方法并不提供不过使用者可以很容易 地利用Blitz所提供来构建 2、POOMA 参考网站WebSite:http://www.codesourcery.com/pooma/pooma   POOMA是个免费高性能C库用于处理并行式科学计算POOMA面向对象设计方便了快速开发对并行机器 进行了优化以达到最高效率方便在工业和研究环境中使用 3、MTL 参考网站WebSite:http://www.osl.iu.edu/research/mtl   Matrix Template Library(MTL)是个高性能泛型组件库提供了各种格式矩阵大量线性代数方面功能在某些 应用使用高性能编译器情况下比如Intel编译器从产生汇编代码可以看出其和手写几乎没有两样效能 4、CGAL 参考网站WebSite:www.cgal.org   Computational Geometry Algorithms Library目是把在计算几何方面大部分重要解决方案和思路方法以 C库形式提供给工业和学术界用户 2009-2-12 3:54:40 疯狂代码 http://CrazyCoder.cn/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值