并行开发笔记-2.基本多个线程运行带传参数

来源:互联网 发布:方舟低配优化补丁 编辑:程序博客网 时间:2024/05/29 13:57

简单思路图
这里写图片描述

//基本多个线程运行带传参数class ThreadTest2{public:    static int main(int argc, char** argv)    {        ThreadTest2 td;        td.RUN();        return 1;    };public:    void RUN(void)    {        //创建线程并传参数        HANDLE hThreads[2];        int pObject1 = 10;        hThreads[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadStart, (LPVOID)&pObject1, 0, NULL);        int pObject2 = 12;        hThreads[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadStart, (LPVOID)&pObject2, 0, NULL);        cout << "Waiting execution..." << endl;        //阻塞 等待所有线程完成        WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);        CloseHandle(hThreads[0]);        CloseHandle(hThreads[1]);        cout << "Thread end..." << endl;    };    static DWORD ThreadStart(LPVOID lpParameter)    {        Sleep(100);        //处理传入的参数        int* pObject = (int*)lpParameter;        cout << "Thread Start..." << "参数" << *pObject << endl;        for (int i = 1; i <= *pObject; i++)        {            cout << i << " ";            Sleep(100);        }        cout << endl;        return 0;    };};

WaitForMultipleObjects 和WaitForSingleObject类似就是很显而易见的阻塞等待了
主线程工作 另外创建两个线程打印 1-10 和1-12相互打架式的输出来!

程序将输出:
Thread Start…参数10
1 Thread Start…参数12
1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
11 12
Thread end…
然后完美闪退!

当然这个创建线程的例子意义不深 或许Ljumovic大大的合并数组例子更有意义

//简单多线程合并数组struct SimpleThread{    static int main(int argc, char** argv);public:    void RUN(void);    //线程入口回调    static DWORD ThreadStart(LPVOID lpParameter);    //打印数组    void PrintArray(int* iArray, int iSize);    //合并数组    void MergeArrays(int* leftArray, int leftArrayLenght, int* rightArray,        int rightArrayLenght, int* mergedArray);};

实现部分(注意不讨论代码规范性)

namespace ThreadDemo{#define THREADS_NUMBER      2#define ELEMENTS_NUMBER     200#define BLOCK_SIZE          ELEMENTS_NUMBER / THREADS_NUMBER#define MAX_VALUE           1000    typedef struct _tagARRAYOBJECT    {        int* iArray;        int iSize;        int iThreadID;    } ARRAYOBJECT, *PARRAYOBJECT;    //入口例子    int SimpleThread::main(int argc, char** argv)    {        SimpleThread td;        td.RUN();        //搞个暂停就不会一闪而过了        system("PAUSE");        return 0;    }    void SimpleThread::RUN(void)    {        int iArray1[BLOCK_SIZE];        int iArray2[BLOCK_SIZE];        int iArray[ELEMENTS_NUMBER];        //结果数组        //造假数据填充到数组里去        for (int iIndex = 0; iIndex < BLOCK_SIZE; iIndex++)        {            iArray1[iIndex] = rand() % MAX_VALUE;            iArray2[iIndex] = rand() % MAX_VALUE;        }        //创建线程并传参数        HANDLE hThreads[THREADS_NUMBER];        ARRAYOBJECT pObject1 = { &(iArray1[0]), BLOCK_SIZE, 0 };        hThreads[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadStart, (LPVOID)&pObject1, 0, NULL);        ARRAYOBJECT pObject2 = { &(iArray2[0]), BLOCK_SIZE, 1 };        hThreads[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadStart, (LPVOID)&pObject2, 0, NULL);        cout << "Waiting execution..." << endl;        //等待所有线程完成[线程个数,线程数组地址,等待时间]        WaitForMultipleObjects(THREADS_NUMBER, hThreads, TRUE, INFINITE);        //合并数组        MergeArrays(&iArray1[0], BLOCK_SIZE, &iArray2[0], BLOCK_SIZE, &iArray[0]);        //打印排好的数组        PrintArray(iArray, ELEMENTS_NUMBER);        CloseHandle(hThreads[0]);        CloseHandle(hThreads[1]);        cout << "Array sorted..." << endl;    }    DWORD SimpleThread::ThreadStart(LPVOID lpParameter)    {        //处理传入的参数        PARRAYOBJECT pObject = (PARRAYOBJECT)lpParameter;        int iTmp = 0;        for (int iIndex = 0; iIndex < pObject->iSize; iIndex++)        {            for (int iEndIndex = pObject->iSize - 1; iEndIndex > iIndex; iEndIndex--)            {                if (pObject->iArray[iEndIndex] < pObject->iArray[iIndex])                {                    iTmp = pObject->iArray[iEndIndex];                    pObject->iArray[iEndIndex] = pObject->iArray[iIndex];                    pObject->iArray[iIndex] = iTmp;                }            }        }        return 0;    }    void SimpleThread::PrintArray(int* iArray, int iSize)    {        for (int iIndex = 0; iIndex < iSize; iIndex++)            cout << " " << iArray[iIndex];        cout << endl;    }    void SimpleThread::MergeArrays(int* leftArray, int leftArrayLenght, int* rightArray,        int rightArrayLenght, int* mergedArray)    {        int i = 0;        int j = 0;        int k = 0;        while (i < leftArrayLenght && j < rightArrayLenght)        {            if (leftArray[i] < rightArray[j])                mergedArray[k] = leftArray[i++];    //注意i++最好拆开写好理解些            else                mergedArray[k] = rightArray[j++];   //同上 这里就作死了            k++;        }        if (i >= leftArrayLenght)        {            while (j < rightArrayLenght)                mergedArray[k++] = rightArray[j++]; //作死的省掉了哦        }        if (j >= rightArrayLenght)        {            while (i < leftArrayLenght)                mergedArray[k++] = leftArray[i++];        }    }}

程序将输出:
Waiting execution…
6 7 20 21 21 30 31 35 35 37 40 41 41 52 53 72 82 84 97 101 106 107 115 118 127
141 145 150 153 161 168 169 190 191 199 209 221 253 264 270 281 281 287 288 290
291 292 299 306 308 310 316 322 323 333 334 337 348 350 350 350 355 358 359 370
374 376 382 383 386 391 393 410 413 418 421 421 422 430 436 439 446 447 457 464
467 467 478 483 483 484 491 500 506 512 514 529 537 537 538 538 541 547 548 548
573 574 588 591 595 596 602 604 617 623 624 626 629 636 639 644 648 648 655 655
658 662 664 667 668 673 673 703 704 705 711 716 718 723 724 724 726 728 729 734
741 745 753 756 757 758 762 767 771 777 778 788 805 807 811 813 827 827 829 833
836 840 842 859 868 869 890 893 894 895 900 900 902 909 912 924 929 930 931 938
941 942 942 944 945 946 954 961 962 966 966 977 986 995 999
Array sorted…

原创粉丝点击