我使用的是Xcode编写代码,主要是为了练习跨语言调用。
创建People.hpp&People.cpp;
先导入需要的文件;
#include <iostream>
#include <string>
#include <sqlite3.h>
#include <thread>
#include <chrono>
#include <random>
#include <set>
模拟数据是插入10000条,从中随机取出100条;
const int MAX_PEOPLE = 10000;
const int SELECT_COUNT = 100;
class Person {
public:
int id;
std::string name;
Person(int id, const std::string& name) : id(id), name(name) {}
};
std::vector<Person> people;
std::set<int> selected; // 用于跟踪已选择的人员序号
sqlite3* db;
void insertPerson(int id, const std::string& name) {
sqlite3_stmt* stmt;
std::string sql = "INSERT INTO people (id, name) VALUES (?, ?)";
sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, NULL);
sqlite3_bind_int(stmt, 1, id);
sqlite3_bind_text(stmt, 2, name.c_str(), -1, SQLITE_STATIC);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
void selectPerson() {
std::mt19937 rng; // Mersenne Twister随机数生成器
while (selected.size() < SELECT_COUNT) {
std::uniform_int_distribution<int> dist(1, MAX_PEOPLE); // 生成1到MAX_PEOPLE之间的随机数
int randomId = dist(rng); // 随机选择一个id
if (selected.find(randomId) == selected.end()) { // 如果人员未被选择过
selected.insert(randomId); // 标记为已选择
std::cout << "Selected person with ID: " << randomId << ", Name: " << people[randomId - 1].name << std::endl;
}
}
}
void randomPeople(void) {
// 初始化SQLite数据库和表
sqlite3_open("people.db", &db);
std::string sql = "CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT);";
sqlite3_exec(db, sql.c_str(), NULL, NULL, NULL);
sqlite3_close(db); // 关闭数据库连接,以便其他线程可以访问它
// 插入人员数据并生成人员列表
for (int i = 1; i <= MAX_PEOPLE; ++i) {
std::string name = "Person " + std::to_string(i); // 示例姓名,你可以根据需要更改它
insertPerson(i, name); // 插入数据到数据库中
people.emplace_back(i, name); // 将人员数据添加到people列表中,以便后续使用
}
sqlite3_close(db); // 再次关闭数据库连接,以便其他线程可以访问它(如果使用多线程插入数据,请确保在插入完成后关闭数据库连接)
// 创建并启动线程来异步选择人员
for (int i = 0; i < 10; ++i) { // 创建10个线程来异步选择人员(可以根据需要调整线程数量)
std::thread t(&selectPerson); // 在新的线程中运行selectPerson函数
t.detach(); // 让线程在后台运行,不需要等待它完成(注意:在多线程环境中使用数据库时,要确保适当的同步和错误处理)
}
std::this_thread::sleep_for(std::chrono::seconds(10)); // 等待10秒,以便线程有时间执行(可以根据需要调整等待时间)
}
我是使用Swift调用C++函数,这里使用C进行桥接;
先创建C文件PeopleBridging.h&PeopleBridging.c,People.cpp中导入PeopleBridging.h;
#include "PeopleBridging.h"
PeopleBridging.h中对函数进行共享;
#ifndef PeopleBridging_h
#define PeopleBridging_h
#include <stdio.h>
#ifdef __cplusplus
extern "C" {
#endif
void randomPeople(void);
#ifdef __cplusplus
}
#endif
void c_randomPeople(void);
#endif /* PeopleBridging_h */
PeopleBridging.c中执行;
#include "PeopleBridging.h"
void c_randomPeople(void) {
randomPeople();
}
现在Swift中可以直接调用了。