Skip to content

Instantly share code, notes, and snippets.

@zemlanin
Created October 31, 2012 07:33
Show Gist options
  • Save zemlanin/3985620 to your computer and use it in GitHub Desktop.
Save zemlanin/3985620 to your computer and use it in GitHub Desktop.
Win32 Multithreading
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
#include "mathskills.h"
using namespace std;
using namespace mathskills;
DWORD WINAPI ThreadOne(LPVOID lpParameter)
{
unsigned int& size = *((unsigned int*)lpParameter);
cout << "ThreadOne start" << endl;
vector< vector<int> > MB = create_matrix(size, 1, 0, 0);
vector< vector<int> > MC = create_matrix(size, 1, 0, 0);
vector< vector<int> > MZ = create_matrix(size, 1, 0, 0);
vector< vector<int> > MT = create_matrix(size, 1, 0, 0);
cout << "ThreadOne created" << endl;
vector< vector<int> > MA = F1(MB, MC, MZ, MT);
if (size < 10)
{
cout << "F1 MA = " << endl;
print_matrix(MA);
}
cout << "ThreadOne end" << endl;
return 0;
}
DWORD WINAPI ThreadTwo(LPVOID lpParameter)
{
unsigned int& size = *((unsigned int*)lpParameter);
cout << "ThreadTwo start" << endl;
vector<int> B = create_vector(size, 1, 0);
vector<int> C = create_vector(size, 1, 0);
vector< vector<int> > MO = create_matrix(size, 1, 0, 0);
vector< vector<int> > ME = create_matrix(size, 1, 0, 0);
cout << "ThreadTwo created" << endl;
vector<int> A = F2(B, C, MO, ME);
if (size < 10)
{
cout << "F2 A = " << endl;
print_vector(A);
}
cout << "ThreadTwo end" << endl;
return 0;
}
DWORD WINAPI ThreadThree(LPVOID lpParameter)
{
unsigned int& size = *((unsigned int*)lpParameter);
cout << "ThreadThree start" << endl;
vector< vector<int> > MB = create_matrix(size, 1, 0, 0);
vector< vector<int> > MC = create_matrix(size, 1, 0, 0);
vector< vector<int> > MK = create_matrix(size, 1, 0, 0);
vector< vector<int> > MT = create_matrix(size, 1, 0, 0);
cout << "ThreadThree created" << endl;
vector< vector<int> > MA = F3(MB, MC, MK, MT);
if (size < 10)
{
cout << "F3 MA = " << endl;
print_matrix(MA);
}
cout << "ThreadThree end" << endl;
return 0;
}
int main(int argc, char* argv[])
{
cout << "Lab5 start" << endl;
unsigned int size = 100;
DWORD ThreadIDs[3];
HANDLE Handles[] = {
CreateThread(NULL, 10240000, ThreadOne, &size, 0, &ThreadIDs[0]),
CreateThread(NULL, 10240000, ThreadTwo, &size, 0, &ThreadIDs[1]),
CreateThread(NULL, 10240000, ThreadThree, &size, 0, &ThreadIDs[2])
};
SetProcessAffinityMask(Handles[0], 1);
SetProcessAffinityMask(Handles[1], 2);
SetProcessAffinityMask(Handles[2], 4);
WaitForMultipleObjects(3, Handles, TRUE, INFINITE);
cout << "Lab5 end" << endl;
return 0;
}
#include <string>
#include <iostream>
#include <vector>
using namespace std;
namespace mathskills
{
// Vector
vector<int> create_vector(int size, int start, int dx)
{
vector<int> result;
int t = start;
for (int i = 0; i < size; i++, t+=dx)
{
result.push_back(t);
}
return result;
}
void print_vector(vector<int> V)
{
for (int i = 0; i < V.size(); i++)
{
std::cout << V[i] << " ";
}
std::cout << "\n";
}
vector<int> sum(vector<int> A, vector<int> B)
{
vector<int> result;
for (int i = 0; i < A.size(); i++)
{
result.push_back(A[i]+B[i]);
}
return result;
}
vector<int> sub(vector<int> A, vector<int> B)
{
vector<int> result;
for (int i = 0; i < A.size(); i++)
{
result.push_back(A[i]-B[i]);
}
return result;
}
int dot(vector<int> A, vector<int> B)
{
int result = 0;
for (int i = 0; i < A.size(); i++)
{
result += A[i]*B[i];
}
return result;
}
vector<int> sort_vector(vector<int> V)
{
vector<int> result = V;
sort(result.begin(), result.end());
return result;
}
// Matrix
vector< vector<int> > create_matrix(int size, int start, int dx, int dy)
{
vector< vector<int> > result;
int t = start;
for (int i = 0; i < size; i++, t+=dy)
{
result.push_back(create_vector(size, t, dx));
}
return result;
}
void print_matrix(vector< vector<int> > MX)
{
for (int i = 0; i < MX.size(); i++)
{
print_vector(MX[i]);
}
}
vector< vector<int> > transpon(vector< vector<int> > MX)
{
vector< vector<int> > result;
for (int i = 0; i < MX.size(); i++)
{
vector<int> tResult;
for (int j = 0; j < MX[0].size(); j++)
{
tResult.push_back(MX[j][i]);
}
result.push_back(tResult);
}
return result;
}
vector< vector<int> > sum(vector< vector<int> > MA, vector< vector<int> > MB)
{
vector< vector<int> > result;
for (int i = 0; i < MA.size(); i++)
{
result.push_back(sum(MA[i], MB[i]));
}
return result;
}
vector< vector<int> > sub(vector< vector<int> > MA, vector< vector<int> > MB)
{
vector< vector<int> > result;
for (int i = 0; i < MA.size(); i++)
{
result.push_back(sub(MA[i], MB[i]));
}
return result;
}
vector<int> mul(vector<int> A, vector< vector<int> > MB)
{
vector<int> result;
vector< vector<int> > MBt = transpon(MB);
for (int i = 0; i < MB.size(); i++)
{
result.push_back(dot(A, MBt[i]));
}
return result;
}
vector< vector<int> > mul(vector< vector<int> > MA, vector< vector<int> > MB)
{
vector< vector<int> > result;
for (int i = 0; i < MA.size(); i++)
{
result.push_back(mul(MA[i], MB));
}
return result;
}
// Enum'd
vector< vector<int> > F1(vector< vector<int> > MB, vector< vector<int> > MC, vector< vector<int> > MZ, vector< vector<int> > MT)
{
return mul(MB, sum(MC, mul(MZ, MT)));
}
vector<int> F2(vector<int> B, vector<int> C, vector< vector<int> > MO, vector< vector<int> > ME)
{
return sort_vector(sum(B, mul(C, mul(MO, ME))));
}
vector< vector<int> > F3(vector< vector<int> > MB, vector< vector<int> > MC, vector< vector<int> > MK, vector< vector<int> > MT)
{
return sub(mul(mul(MB, MC), MK), MT);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment