Thread test works!
This commit is contained in:
355
Pipe/threads.c
355
Pipe/threads.c
@ -6,103 +6,32 @@
|
||||
#include "ringbuffer.h"
|
||||
#include "pipe.h"
|
||||
|
||||
#define NUMBER_OF_ELEMENTS 1000
|
||||
|
||||
/* Integrate every element of the signal. */
|
||||
static void increment(pipe_t * const p)
|
||||
static void increment(pipe_t * const pipe)
|
||||
{
|
||||
while (Pipe_isFilled(p))
|
||||
uint8_t check = 1;
|
||||
while (Pipe_IsFilled(pipe))
|
||||
{
|
||||
uint32_t item = Pipe_Read(p);
|
||||
item++;
|
||||
Pipe_Write(p, item);
|
||||
uint32_t item = Pipe_Read(pipe);
|
||||
|
||||
// do something
|
||||
|
||||
Pipe_Write(pipe, item);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Print the signal. */
|
||||
static void write_to_file1(pipe_t * const pipe)
|
||||
{
|
||||
HANDLE hFile;
|
||||
char DataBuffer[128];
|
||||
DWORD dwBytesWritten = 0;
|
||||
|
||||
hFile = CreateFile("thread1.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
while (1) {
|
||||
while (Pipe_isFilled(pipe))
|
||||
{
|
||||
sprintf_s(DataBuffer, 128, "%d\r\n", Pipe_Read(pipe));
|
||||
WriteFile(hFile, DataBuffer, (DWORD)strlen(DataBuffer), &dwBytesWritten, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void write_to_file2(pipe_t * const pipe)
|
||||
{
|
||||
HANDLE hFile;
|
||||
char DataBuffer[128];
|
||||
DWORD dwBytesWritten = 0;
|
||||
|
||||
hFile = CreateFile("thread2.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
while (1) {
|
||||
while (Pipe_isFilled(pipe))
|
||||
{
|
||||
sprintf_s(DataBuffer, 128, "%d\r\n", Pipe_Read(pipe));
|
||||
WriteFile(hFile, DataBuffer, (DWORD)strlen(DataBuffer), &dwBytesWritten, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DWORD WINAPI incrementThread1(LPVOID lpParam)
|
||||
{
|
||||
pipe_t * pipe = (pipe_t *)lpParam;
|
||||
LARGE_INTEGER time;
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* Generate input */
|
||||
QueryPerformanceCounter(&time);
|
||||
Pipe_Insert(pipe, (uint32_t)time.u.LowPart);
|
||||
QueryPerformanceCounter(&time);
|
||||
Pipe_Insert(pipe, (uint32_t)time.u.LowPart);
|
||||
QueryPerformanceCounter(&time);
|
||||
Pipe_Insert(pipe, (uint32_t)time.u.LowPart);
|
||||
|
||||
increment(pipe);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI incrementThread2(LPVOID lpParam)
|
||||
{
|
||||
pipe_t * pipe = (pipe_t *)lpParam;
|
||||
LARGE_INTEGER time;
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* Generate input */
|
||||
QueryPerformanceCounter(&time);
|
||||
Pipe_Insert(pipe, (uint32_t)time.u.LowPart);
|
||||
QueryPerformanceCounter(&time);
|
||||
Pipe_Insert(pipe, (uint32_t)time.u.LowPart);
|
||||
QueryPerformanceCounter(&time);
|
||||
Pipe_Insert(pipe, (uint32_t)time.u.LowPart);
|
||||
|
||||
increment(pipe);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI incrementThread3(LPVOID lpParam)
|
||||
DWORD WINAPI Thread1(LPVOID lpParam)
|
||||
{
|
||||
pipe_t * pipe = (pipe_t *)lpParam;
|
||||
|
||||
while (1)
|
||||
{
|
||||
increment(pipe);
|
||||
}
|
||||
/* Generate input */
|
||||
for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
|
||||
Pipe_Insert(pipe, 42);
|
||||
increment(pipe);
|
||||
|
||||
Pipe_Write(pipe, UINT32_MAX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -110,50 +39,242 @@ DWORD WINAPI incrementThread3(LPVOID lpParam)
|
||||
DWORD WINAPI Thread2(LPVOID lpParam)
|
||||
{
|
||||
pipe_t * pipe = (pipe_t *)lpParam;
|
||||
write_to_file2(pipe);
|
||||
|
||||
/* Generate input */
|
||||
for (int i = 0; i < NUMBER_OF_ELEMENTS; i++)
|
||||
Pipe_Insert(pipe, 23);
|
||||
increment(pipe);
|
||||
|
||||
Pipe_Write(pipe, UINT32_MAX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI Thread1(LPVOID lpParam)
|
||||
DWORD WINAPI Thread3(LPVOID lpParam)
|
||||
{
|
||||
pipe_t * pipe = (pipe_t *)lpParam;
|
||||
write_to_file1(pipe);
|
||||
uint32_t item = 0;
|
||||
uint8_t check = 1;
|
||||
uint8_t symbol_counter = 0;
|
||||
|
||||
while (symbol_counter < 2)
|
||||
{
|
||||
while (Pipe_IsFilled(pipe))
|
||||
{
|
||||
item = Pipe_Read(pipe);
|
||||
|
||||
if (item == UINT32_MAX)
|
||||
{
|
||||
symbol_counter++;
|
||||
break;
|
||||
}
|
||||
|
||||
if (item != 42 && item != 23)
|
||||
printf("failed\n");
|
||||
|
||||
Pipe_Write(pipe, item);
|
||||
}
|
||||
}
|
||||
|
||||
Pipe_Write(pipe, UINT32_MAX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void log(pipe_t * const source, pipe_t * const target, uint32_t element) {}
|
||||
|
||||
void threads(void)
|
||||
DWORD WINAPI Thread4(LPVOID lpParam)
|
||||
{
|
||||
/* Create pipes and connect them */
|
||||
Pipe_Create(increment_pipe1, 4, 1, NULL, log);
|
||||
Pipe_Create(increment_pipe2, 4, 1, NULL, log);
|
||||
Pipe_Create(increment_pipe3, 8, 2, NULL, log);
|
||||
Pipe_Create(write_to_file1_pipe, 8, 1, NULL, log);
|
||||
Pipe_Create(write_to_file2_pipe, 8, 1, NULL, log);
|
||||
pipe_t * pipe = (pipe_t *)lpParam;
|
||||
uint32_t item = 0;
|
||||
uint8_t check = 1;
|
||||
|
||||
while (item != UINT32_MAX)
|
||||
{
|
||||
while (Pipe_IsFilled(pipe))
|
||||
{
|
||||
item = Pipe_Read(pipe);
|
||||
|
||||
Pipe_Connect(&increment_pipe1, &increment_pipe3);
|
||||
Pipe_Connect(&increment_pipe2, &increment_pipe3);
|
||||
Pipe_Connect(&increment_pipe3, &write_to_file1_pipe);
|
||||
Pipe_Connect(&increment_pipe3, &write_to_file2_pipe);
|
||||
if (item == UINT32_MAX)
|
||||
break;
|
||||
|
||||
/* Create Threads */
|
||||
CreateThread(NULL, 0, incrementThread1, &increment_pipe1, 0, NULL);
|
||||
CreateThread(NULL, 0, incrementThread2, &increment_pipe2, 0, NULL);
|
||||
CreateThread(NULL, 0, incrementThread3, &increment_pipe3, 0, NULL);
|
||||
if (item != 42 && item != 23)
|
||||
printf("failed\n");
|
||||
|
||||
HANDLE thread1Handle, thread2Handle;
|
||||
Pipe_Write(pipe, item);
|
||||
}
|
||||
}
|
||||
|
||||
thread1Handle = CreateThread(NULL, 0, Thread1, &write_to_file1_pipe, 0, NULL);
|
||||
thread2Handle = CreateThread(NULL, 0, Thread2, &write_to_file2_pipe, 0, NULL);
|
||||
|
||||
HANDLE threadHandles[] = { thread1Handle, thread2Handle };
|
||||
WaitForMultipleObjects(2, threadHandles, TRUE, INFINITE);
|
||||
|
||||
CloseHandle(thread1Handle);
|
||||
CloseHandle(thread2Handle);
|
||||
Pipe_Write(pipe, UINT32_MAX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
DWORD WINAPI Thread5(LPVOID lpParam)
|
||||
{
|
||||
pipe_t * pipe = (pipe_t *)lpParam;
|
||||
uint32_t item = 0;
|
||||
uint8_t check = 1;
|
||||
|
||||
while (item != UINT32_MAX)
|
||||
{
|
||||
while (Pipe_IsFilled(pipe))
|
||||
{
|
||||
item = Pipe_Read(pipe);
|
||||
if (item == 0 || item > 102)
|
||||
{
|
||||
check = 0;
|
||||
}
|
||||
|
||||
if (item == UINT32_MAX)
|
||||
break;
|
||||
|
||||
Pipe_Write(pipe, item);
|
||||
}
|
||||
}
|
||||
|
||||
Pipe_Write(pipe, UINT32_MAX);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Run_Threads(pipe_t * pipe1, pipe_t * pipe2, pipe_t * pipe3, pipe_t * pipe4, pipe_t * pipe5)
|
||||
{
|
||||
/* Create Threads */
|
||||
HANDLE threadHandles[5];
|
||||
|
||||
threadHandles[0] = CreateThread(NULL, 0, Thread1, pipe1, 0, NULL);
|
||||
threadHandles[1] = CreateThread(NULL, 0, Thread2, pipe2, 0, NULL);
|
||||
threadHandles[2] = CreateThread(NULL, 0, Thread3, pipe3, 0, NULL);
|
||||
threadHandles[3] = CreateThread(NULL, 0, Thread4, pipe4, 0, NULL);
|
||||
threadHandles[4] = CreateThread(NULL, 0, Thread5, pipe5, 0, NULL);
|
||||
|
||||
WaitForMultipleObjects(5, threadHandles, TRUE, INFINITE);
|
||||
|
||||
CloseHandle(threadHandles[0]);
|
||||
CloseHandle(threadHandles[1]);
|
||||
CloseHandle(threadHandles[2]);
|
||||
CloseHandle(threadHandles[3]);
|
||||
CloseHandle(threadHandles[4]);
|
||||
}
|
||||
|
||||
uint8_t ringbuffer_valid_and_equal(ringbuffer_t * rb1, ringbuffer_t * rb2)
|
||||
{
|
||||
//char DataBuffer[128];
|
||||
//DWORD dwBytesWritten;
|
||||
|
||||
uint32_t element1 = 0;
|
||||
uint32_t element2 = 0;
|
||||
uint32_t element_42_counter = 0;
|
||||
uint32_t element_23_counter = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
element1 = RingBuffer_Read(rb1);
|
||||
element2 = RingBuffer_Read(rb2);
|
||||
|
||||
if (element1 != element2)
|
||||
printf("Elements unequal!\n");
|
||||
|
||||
if (element1 == UINT32_MAX)
|
||||
break;
|
||||
|
||||
if (element1 == 42)
|
||||
{
|
||||
element_42_counter++;
|
||||
//sprintf_s(DataBuffer, 128, "%u - %u\r\n", element1, element_42_counter);
|
||||
}
|
||||
|
||||
if (element1 == 23)
|
||||
{
|
||||
element_23_counter++;
|
||||
//sprintf_s(DataBuffer, 128, "%u - %u\r\n", element1, element_23_counter);
|
||||
}
|
||||
|
||||
//WriteFile(h, DataBuffer, (DWORD)strlen(DataBuffer), &dwBytesWritten, NULL);
|
||||
}
|
||||
|
||||
if ((element_42_counter != element_23_counter) || (element_42_counter != NUMBER_OF_ELEMENTS))
|
||||
{
|
||||
printf("error!\n");
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void log(pipe_t * const source, pipe_t * const target, uint32_t element)
|
||||
{
|
||||
/*wchar_t text[64];
|
||||
swprintf_s(text, 64, L"%s: %d\n", source->name, element);
|
||||
OutputDebugStringW(text);*/
|
||||
}
|
||||
|
||||
void threads(uint32_t loops)
|
||||
{
|
||||
/* Create pipes and connect them */
|
||||
Pipe_Create(increment_pipe1, 1, 1, NULL, log);
|
||||
Pipe_Create(increment_pipe2, 1, 1, NULL, log);
|
||||
Pipe_Create(increment_pipe3, 2, 2, NULL, log);
|
||||
Pipe_Create(increment_pipe4, 1, 1, NULL, log);
|
||||
Pipe_Create(increment_pipe5, 1, 1, NULL, log);
|
||||
Pipe_Create(check_pipe1, 1, 1, NULL, log);
|
||||
Pipe_Create(check_pipe2, 1, 1, NULL, log);
|
||||
|
||||
Pipe_CreateInputBuffer(increment_pipe1, NUMBER_OF_ELEMENTS+2);
|
||||
Pipe_CreateInputBuffer(increment_pipe2, NUMBER_OF_ELEMENTS+2);
|
||||
|
||||
Pipe_CreateConnection(increment_pipe1, increment_pipe3, NUMBER_OF_ELEMENTS+2);
|
||||
Pipe_CreateConnection(increment_pipe2, increment_pipe3, NUMBER_OF_ELEMENTS+2);
|
||||
Pipe_CreateConnection(increment_pipe3, increment_pipe4, NUMBER_OF_ELEMENTS * 2 + 2);
|
||||
Pipe_CreateConnection(increment_pipe3, increment_pipe5, NUMBER_OF_ELEMENTS * 2 + 2);
|
||||
Pipe_CreateConnection(increment_pipe4, check_pipe1, NUMBER_OF_ELEMENTS * 2 + 2);
|
||||
Pipe_CreateConnection(increment_pipe5, check_pipe2, NUMBER_OF_ELEMENTS * 2 + 2);
|
||||
|
||||
//HANDLE hFile;
|
||||
//hFile = CreateFile("buffer.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||
|
||||
SYSTEMTIME local_time;
|
||||
GetLocalTime(&local_time);
|
||||
|
||||
printf("\n");
|
||||
printf("Starting Thread Test\n");
|
||||
printf("at %02d/%02d/%02d %02d:%02d:%02d\n", local_time.wYear, local_time.wMonth, local_time.wDay, local_time.wHour, local_time.wMinute, local_time.wSecond);
|
||||
printf("\n");
|
||||
|
||||
LARGE_INTEGER Frequency;
|
||||
LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
|
||||
QueryPerformanceFrequency(&Frequency);
|
||||
QueryPerformanceCounter(&StartingTime);
|
||||
|
||||
uint32_t success_counter = 0;
|
||||
for (int i = 0; i < loops; i++)
|
||||
{
|
||||
Run_Threads(&increment_pipe1, &increment_pipe2, &increment_pipe3, &increment_pipe4, &increment_pipe5);
|
||||
|
||||
//if (ringbuffer_valid_and_equal(check_pipe1.input_connector->connection[0], check_pipe2.input_connector->connection[0], hFile))
|
||||
if (ringbuffer_valid_and_equal(check_pipe1.input_connector->connection[0], check_pipe2.input_connector->connection[0]))
|
||||
success_counter++;
|
||||
}
|
||||
QueryPerformanceCounter(&EndingTime);
|
||||
ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
|
||||
ElapsedMicroseconds.QuadPart *= 1000000;
|
||||
ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
|
||||
int seconds = ElapsedMicroseconds.QuadPart / 1000000;
|
||||
|
||||
int hours = seconds / 3600;
|
||||
int minutes = (seconds - (hours * 3600)) / 60;
|
||||
seconds = seconds - (minutes * 60);
|
||||
|
||||
printf("Loops: %d\n", loops);
|
||||
printf("Successfull: %d\n", success_counter);
|
||||
printf("Failed: %d\n", loops - success_counter);
|
||||
printf("Count of Concurrent Data Operations: %d\n", 2 * NUMBER_OF_ELEMENTS * loops);
|
||||
|
||||
printf("\n");
|
||||
GetLocalTime(&local_time);
|
||||
printf("Test finished\n");
|
||||
printf("at %02d/%02d/%02d %02d:%02d:%02d\n", local_time.wYear, local_time.wMonth, local_time.wDay, local_time.wHour, local_time.wMinute, local_time.wSecond);
|
||||
printf("Elapsed time: %02d:%02d:%02d", hours, minutes, seconds);
|
||||
printf("\n");
|
||||
|
||||
|
||||
//CloseHandle(hFile);
|
||||
}
|
||||
Reference in New Issue
Block a user