第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定

C++11服務(wù)器學(xué)習(xí):快速入門與實(shí)踐指南

標(biāo)簽:
雜七雜八
概述

C++11引入了多项新特性,使得开发更为高效、安全且现代化。在服务器开发中,C++11提供了多项关键功能,如多线程支持、智能指针、异步I/O接口等,显著提升性能和代码质量。接下来,我们将逐步探索这些特性及其在服务器开发中的应用。

C++11基础介绍

C++11引入了可移动类型、范围基元、并行编程支持等新特性,这些是构建高效、安全网络服务器的关键。它允许开发者编写更纯净、更易于理解的代码,同时保持高性能。相比于C++98,C++11的特点更适合要求严格、高度优化且并发密集型的服务器应用。

多线程编程

了解std::thread

C++11引入了线程库,简化了并发编程。std::thread允许开发者创建、调度、管理线程,支持线程间的同步与通信。

#include <iostream>
#include <thread>

void print_hello(int id) {
    std::cout << "Hello from thread " << id << std::endl;
}

int main() {
    std::thread t1(print_hello, 1);
    std::thread t2(print_hello, 2);

    t1.join();
    t2.join();

    std::cout << "End of main." << std::endl;
    return 0;
}

实现并发操作的基本示例

使用std::asyncstd::future进行异步操作,避免线程阻塞,提升服务器响应效率。

#include <iostream>
#include <future>
#include <thread>

void print_hello() {
    std::cout << "Hello from async thread." << std::endl;
}

int main() {
    std::future<void> future = std::async(std::launch::async, print_hello);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    future.get(); // 等待完成
    std::cout << "End of main." << std::endl;
    return 0;
}

线程安全与互斥锁的使用

为了确保多线程环境下的数据安全性,C++11提供了std::mutexstd::lock_guard等互斥锁机制。

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

std::mutex mtx;

void thread_safe_print(int id) {
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << "Thread " << id << " has acquired lock." << std::endl;
    // 对于线程安全的代码执行
}

int main() {
    std::thread t1(thread_safe_print, 1);
    std::thread t2(thread_safe_print, 2);

    t1.join();
    t2.join();

    std::cout << "End of main." << std::endl;
    return 0;
}
智能指针与资源管理

智能指针(如std::shared_ptrstd::unique_ptr)自动管理内存,提高代码安全性和可维护性。

std::shared_ptrstd::unique_ptr介绍

智能指针提供了一种安全、简洁的方式来管理对象生命周期,确保资源在使用完毕后能够正确释放。

#include <iostream>
#include <memory>

class Resource {
public:
    Resource() : alive(true) {}
    ~Resource() { std::cout << "Resource is released." << std::endl; }
    bool is_alive() const { return alive; }
private:
    bool alive;
};

int main() {
    std::shared_ptr<Resource> ptr1 = std::make_shared<Resource>();
    std::unique_ptr<Resource> ptr2(new Resource());

    std::cout << "ptr1 alive: " << ptr1.use_count() << std::endl;
    std::cout << "ptr2 alive: " << ptr2.use_count() << std::endl;

    return 0;
}

如何有效管理服务器资源

在服务器应用中,合理使用智能指针管理网络连接、文件句柄等资源,避免内存泄漏和资源竞争。

异步I/O与非阻塞编程

异步I/O概念

异步I/O允许应用程序在等待I/O操作完成时继续执行其他任务,提高整体系统性能。

使用std::async进行异步操作

结合异步I/O和并发编程,可以构建响应迅速、处理高并发请求的服务器。

#include <iostream>
#include <future>
#include <string>

void process_request(std::string request) {
    std::cout << "Processing request: " << request << std::endl;
}

int main() {
    std::string request = "GET /index.html HTTP/1.1";
    std::future<void> future = std::async(std::launch::async, process_request, request);

    // 在处理其他请求的同时,等待当前请求完成
    future.get();

    return 0;
}

非阻塞I/O在服务器设计中的应用

非阻塞I/O允许在等待I/O事件时继续执行其他任务,减少线程阻塞时间,优化服务器性能。

#include <iostream>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <string>

void handle_connection(int socket) {
    std::cout << "Handling connection on socket: " << socket << std::endl;
    // 处理连接的代码
}

int main() {
    // 创建监听套接字
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_fd < 0) {
        std::cerr << "Error creating socket" << std::endl;
        return 1;
    }

    // 设置套接字为非阻塞模式
    int flags = fcntl(socket_fd, F_GETFL, 0);
    fcntl(socket_fd, F_SETFL, flags | O_NONBLOCK);

    // 监听套接字
    sockaddr_in addr = {0};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(socket_fd, (sockaddr *)&addr, sizeof(addr));
    listen(socket_fd, 5);

    while (true) {
        sockaddr_in client_addr;
        socklen_t len = sizeof(client_addr);
        int client_socket = accept(socket_fd, (sockaddr *)&client_addr, &len);

        if (client_socket < 0) {
            if (errno == EAGAIN || errno == EWOULDBLOCK) {
                // 如果失败是由于I/O完成队列为空,继续监听
                std::cout << "No new connections, waiting..." << std::endl;
                continue;
            } else {
                std::cerr << "Error accepting connection" << std::endl;
                return 1;
            }
        }

        // 那个socket可能是非阻塞的,所以需要检查条件
        if (fcntl(client_socket, F_GETFL) & O_NONBLOCK) {
            std::cout << "Non-blocking socket detected, setting handler" << std::endl;
            std::thread t(handle_connection, client_socket);
            t.detach();
        } else {
            std::cout << "Blocking socket, handling manually" << std::endl;
            handle_connection(client_socket);
        }

        // 对于一个非阻塞socket,我们可以继续监听,而不是阻塞在这里等待
    }

    return 0;
}
命名空间与模块化

命名空间管理代码

使用命名空间可以避免命名冲突,同时增加代码的可读性和可维护性。

#include <iostream>

namespace net {
    void send_message(const std::string &message) {
        std::cout << "Sending message: " << message << std::endl;
    }
}

int main() {
    net::send_message("Hello, World!");
    return 0;
}

模块化代码组织与复用

模块化设计允许将复杂系统分解为更小、更易管理的部分,提高代码重用性。

总结与实践

整合以上所有概念,我们可以通过构建一个简单的异步HTTP服务器来实践上述知识。

实例:构建异步HTTP服务器

#include <iostream>
#include <string>
#include <memory>
#include <map>
#include <future>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

const int PORT = 8080;
const int MAX_REQUESTS = 10;

std::map<int, std::future<void>> requests;

void handle_request(int socket) {
    std::string request, response;
    while (true) {
        char buffer[1024] = {0};
        ssize_t bytes_read = recv(socket, buffer, 1024, 0);
        if (bytes_read <= 0) break;
        request += buffer;
    }
    if (request == "GET / HTTP/1.1") {
        response = "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nWelcome!";
    } else {
        response = "HTTP/1.1 404 Not Found\r\n";
    }
    send(socket, response.c_str(), response.length(), 0);
    requests.erase(socket);
}

void handle_accept(int server_socket) {
    sockaddr_in client_address;
    socklen_t address_length = sizeof(client_address);
    int client_socket = accept(server_socket, (sockaddr *)&client_address, &address_length);
    if (client_socket >= 0) {
        requests[client_socket] = std::async(std::launch::async, handle_request, client_socket);
    } else {
        std::cerr << "Error accepting connection" << std::endl;
    }
}

int main() {
    int server_socket = socket(AF_INET, SOCK_STREAM, 0);
    if (server_socket < 0) {
        std::cerr << "Error creating socket" << std::endl;
        return 1;
    }

    sockaddr_in address = {0};
    address.sin_family = AF_INET;
    address.sin_port = htons(PORT);
    address.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(server_socket, (sockaddr *)&address, sizeof(address));
    listen(server_socket, MAX_REQUESTS);
    while (true) {
        handle_accept(server_socket);
        if (requests.size() >= MAX_REQUESTS) {
            // 连接队列已满,稍后继续监听
            std::cout << "Queue full, waiting..." << std::endl;
            continue;
        }
    }

    return 0;
}

通过这个简单的异步HTTP服务器实例,我们结合了多线程、智能指针、异步I/O和模块化设计等C++11特性,展示了如何构建高效、安全的服务器应用。在实际应用中,可以进一步扩展功能,例如增加完整的HTTP处理逻辑、错误处理和更复杂的并发控制机制。

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊有機(jī)會得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號

舉報(bào)

0/150
提交
取消