C++多线程适合求一些较为复杂的数据,博主采用求素数只是为了更好地举例,实际的效率提高并不明显。多线程一般用于处理多个复杂的数据,将复杂的数据分为多组数据,使用多线程计算多组数据,最后将数据汇总。
第一步:包含多线程及计算头文件
#include "qthread.h"
#include <iostream>
#include <cmath>
#include <ctime>
第二步:定义需要计算的结构体和互斥量
#define MAX_THREADS 4
typedef struct
{
int thread_id; //进程id
int start_index; //开始下标
int end_index; //截止下标
vector<int> * m_Data; //用于存储素数
}ParaNum;
pthread_mutex_t m_lock; //互斥量
第三步:实现线程计算函数
void * CalThread(void * arg)
{
//获取对象
ParaNum * para = (ParaNum *)arg;
vector<int> * temVecNum = para->m_Data;
printf("NO:%d Thread", para->thread_id);
for (int i = para->start_index; i < para->end_index; i++)
{
//加锁
pthread_mutex_lock(&m_lock);
//是素数压入容器中
if (isPrime(i))
{
temVecNum->push_back(i);
}
//解锁
pthread_mutex_unlock(&m_lock);
}
return NULL;
}
第四步:创建线程,调用计算函数
//使用c++ 11多线程实现求素数
void GetSuShuThread(vector<int> & VecNum)
{
//创建线程
pthread_t workers[MAX_THREADS];
//初始化互斥量
pthread_mutex_init(&m_lock, NULL);
//创建数据
ParaNum Para[MAX_THREADS];
memset(&Para, 0, sizeof(ParaNum) * MAX_THREADS);
Para[0].start_index = 0; Para[0].end_index = 2500000; Para[0].m_Data = &VecNum;
Para[1].start_index = 2500000; Para[1].end_index = 5000000; Para[1].m_Data = &VecNum;
Para[2].start_index = 5000000; Para[2].end_index = 7500000; Para[2].m_Data = &VecNum;
Para[3].start_index = 7500000; Para[3].end_index = 10000000; Para[3].m_Data = &VecNum;
//创建计算进程
for (int i = 1; i < MAX_THREADS; i++)
{
pthread_create(&workers[i], NULL, CalThread, &Para[i]);
}
//等待所有线程结束 主线程计算
CalThread(&Para[0]);
//等待所有线程结束 释放线程资源
for (int i = 1; i < MAX_THREADS; i++)
{
pthread_join(workers[i], NULL);
}
}
完整代码如下
#include "qthread.h"
#include <iostream>
#include <cmath>
#include <ctime>
#include <vector>
using namespace std;
#define MAX_THREADS 4
typedef struct
{
int thread_id; //进程id
int start_index; //开始下标
int end_index; //截止下标
vector<int> * m_Data; //用于存储素数
}ParaNum;
pthread_mutex_t m_lock; //互斥量
//如果为真,即是素数;否则,不是素数
bool isPrime(int n)
{
int i;
for(i = 2; i <= (double)sqrt((double)n); i++)
{
// 如果能被除了1和它本身的数整除,就不是素数
if((n % i) == 0)
return false;
}
//是素数
return true;
}
void * CalThread(void * arg)
{
//获取对象
ParaNum * para = (ParaNum *)arg;
vector<int> * temVecNum = para->m_Data;
printf("NO:%d Thread", para->thread_id);
for (int i = para->start_index; i < para->end_index; i++)
{
//加锁
pthread_mutex_lock(&m_lock);
//是素数压入容器中
if (isPrime(i))
{
temVecNum->push_back(i);
}
//解锁
pthread_mutex_unlock(&m_lock);
}
return NULL;
}
//使用c++ 11多线程实现求素数
void GetSuShuThread(vector<int> & VecNum)
{
//创建线程
pthread_t workers[MAX_THREADS];
//初始化互斥量
pthread_mutex_init(&m_lock, NULL);
//创建数据
ParaNum Para[MAX_THREADS];
memset(&Para, 0, sizeof(ParaNum) * MAX_THREADS);
Para[0].start_index = 0; Para[0].end_index = 2500000; Para[0].m_Data = &VecNum;
Para[1].start_index = 2500000; Para[1].end_index = 5000000; Para[1].m_Data = &VecNum;
Para[2].start_index = 5000000; Para[2].end_index = 7500000; Para[2].m_Data = &VecNum;
Para[3].start_index = 7500000; Para[3].end_index = 10000000; Para[3].m_Data = &VecNum;
//创建计算进程
for (int i = 1; i < MAX_THREADS; i++)
{
pthread_create(&workers[i], NULL, CalThread, &Para[i]);
}
//等待所有线程结束 主线程计算
CalThread(&Para[0]);
//等待所有线程结束 释放线程资源
for (int i = 1; i < MAX_THREADS; i++)
{
pthread_join(workers[i], NULL);
}
}
int main()
{
vector<int> VecNum;
GetSuShuThread(VecNum);
return 0;
}