Регулирование потоков C ++ - PullRequest
0 голосов
/ 02 апреля 2012

Я пытаюсь перевести некоторый код C #, который создает N потоков одновременно и запускает функцию в каждом потоке.

У меня две проблемы:

-Как ограничить N потоковза раз?

- Мой компоновщик, похоже, не распознает статические целые числа FastestMemory и SlowestMemory, когда я ссылаюсь на них в моем основном методе (когда я печатаю значения в конце).

Может ли кто-нибудь помочь, пожалуйста?

Пока у меня есть:

#include "stdafx.h"
#include <Windows.h>
#include <iostream>
#include <vector>
#include <ctime>

using namespace std;


class Test{

public: 
    static unsigned int FastestMemory;
    static unsigned int SlowestMemory;

    public: 
        Test(unsigned a, unsigned b){
            FastestMemory = a;
            SlowestMemory = b;
        }


    struct thread_data
    {
        int m_id;
        thread_data(int id) : m_id(id) {}
    };

    static DWORD WINAPI thread_func(LPVOID lpParameter)
    {
        thread_data *td = (thread_data*)lpParameter;

        int RepetitionNumber = td->m_id;

        printf("thread with id = " + RepetitionNumber + '\n');

        unsigned int start = clock();

        vector<byte> list1;
        vector<byte> list2;
        vector<byte> list3;

        for(int i=0; i<10000000; i++){
            list1.push_back(57);
        }

        for (int i = 0; i < 20000000; i=i+2)
        {
            list2.push_back(56);
        }

        for (int i = 0; i < 10000000; i++)
        {
            byte temp = list1[i];
            byte temp2 = list2[i];
            list3.push_back(temp);
            list2[i] = temp;
            list1[i] = temp2;
        }

        unsigned int timetaken = clock()-start;
        printf(RepetitionNumber + "  Time taken in millisecs: " + timetaken);

        if(timetaken < FastestMemory){
            FastestMemory = timetaken;
        }
        if(timetaken > SlowestMemory){
            SlowestMemory = timetaken;
        }

        return 0;
    }
};


    int _tmain(int argc, _TCHAR* argv[])
    {

        Test* t = new Test(2000000,0);

        for (int i=0; i< 10; i++)
        {
            CreateThread(NULL, 0, Test::thread_func, new Test::thread_data(i) , 0, 0);
        }

        printf("Fastest iteration:" + Test::FastestMemory + '\n'); //Linker not recognising
        printf("Slowest iteration:" + Test::SlowestMemory + '\n'); //Linker not recognising

        int a;

        cin >> a;
    }

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Я не уверен, что вы имеете в виду под "ограничить N потоков за один раз". Вы хотите сказать, что хотите (например) использовать только, скажем, 5 потоков для выполнения 10 задач в вашем вопросе?

Если это так, вы можете использовать какой-нибудь пул потоков. В Windows есть что-то вроде трех отдельных API пулов потоков, а также портов завершения ввода / вывода, которые также могут выступать в качестве пулов потоков. Также довольно легко написать свой собственный пул потоков, если вы обнаружите, что их нет, но структура немного отличается от того, что вы опубликовали.

static unsigned int FastestMemory; объявляет , но не определяет переменную. Вам нужно определить его вне определения класса:

class Test {
    static unsigned int FastestMemory;
    static unsigned int SlowestMemory;
    // ...
};

unsigned int Test::FastestMemory = 0;
unsigned int Test::SlowestMemory = 0;
0 голосов
/ 02 апреля 2012

Вы объявляете, но не определяете свои статические целые числа.

Попробуйте:

class Test{

public: 
    static unsigned int FastestMemory;
    static unsigned int SlowestMemory;
    // ...
};

unsigned int Test::FastestMemory = 0;
unsigned int Test::SlowestMemory = 0;

Что касается определения N потоков, посмотрите на то, что у вас есть, попробуйте использовать CreateThread для создания отдельных потоков и увеличения по мере необходимости.Конечно, выполнение этого даст вам очень простую и, возможно, не очень полезную модель потоков.Я предлагаю почитать о пулах потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...