quarta-feira, 27 de maio de 2015

Usando Threads na plataforma Windows

O Código a seguir apresenta uma demonstração simples de uso de programação multi-thread
na linguagem C. A plataforma utilizada é a gcc em ambiente Windows 7.


//== Inicio do código ===================================================

#include <stdio.h>
#include <stdlib.h>
#include <math.h>


//== principal include para uso de threads na plataforma Windows ========

#include <windows.h>


//== uma função qualquer para ser acessada da thread secundária =========

double tarefa( int i, double j )
{
    return (i * j);
}


//== estrutura de dados para passagem de argumentos ====================

typedef struct {
    int a;
    double b;
    double (*task)( int, double );
} DataArgs;


//== função para a thread secundária ===================================

DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
    DataArgs *args = (DataArgs *)lpParam;

    int z;

    FILE *fh = fopen( "k:/log.txt", "w" );

    for ( z=0; z<1000; z++ )
    {
        double resultado = args->task( args->a+z, args->b );
        fprintf( fh, "\nThread SECUNDARIA: %d\t%f", z,resultado );
    }

    fclose ( fh );

    return 0;
}


//== thread main =======================================================

int main()
{
    int x;


//  declaração de estrutura de dados para servirem como argumentos 
//  para a função da thread secundária

    DataArgs dados;
    dados.a = 20;
    dados.b = 3.141592;
    dados.task = tarefa;

    HANDLE  hThreadArray;
    DWORD   dwThreadIdArray;

//  criação da thread secundária

    hThreadArray = CreateThread(
        NULL,                   // default security attributes
        0,                      // use default stack size
        MyThreadFunction,       // thread function name
        &dados,                 // argument to thread function
        0,                      // use default creation flags
        &dwThreadIdArray );     // returns the thread identifier

    if ( hThreadArray == NULL )
    {
        puts( "\nErro ao criar Thread.\n" );
        return 1;
    }

//  outras coisas da thread main

    for (x=0; x < 1000000; x ++)
    {
        printf( "\nThread MAIN: %f", sqrt( x ) );
    }
    return 0;
}

//== fim do código ====================================================


Links de referência:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682516(v=vs.85).aspx
    https://msdn.microsoft.com/en-us/library/windows/desktop/ms682512(v=vs.85).aspx


Bom estudo e até a próxima.

Nenhum comentário: