|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
02.12.2012, 21:24 | #1 |
Регистрация: 30.07.2010
Сообщений: 4
|
Поиск простых чисел потоками
Поиск простых чисел в указанном интервале чисел, разделенном на несколько диапазонов. Обработка каждого диапазона производится в порожденном процессе (потоке).
Нужна помощь никак не получается что-то путное сообразить. Точно не знаю, но кажется что CreateThread возвращает не то что нужно, в добавок к этому значение r не соразмерна с WAIT_OBJECT_0 или я что-то путаю. Так же не получается функции findPrimes передать аргумент с нормальным значение. Помогите разобраться пожалуйста. Код:
Последний раз редактировалось Stilet; 02.12.2012 в 21:49. |
02.12.2012, 22:40 | #2 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
A зачем ждать каждый поток отдельно? Ждите прямо завершения всех рабочих потоков. Кроме того, у вас несколько потоков пишут в глобальные переменные - для этого надо делать синхронизацию, иначе не есть хорошо...
|
02.12.2012, 23:02 | #3 | ||
Регистрация: 30.07.2010
Сообщений: 4
|
Цитата:
Цитата:
Так же уже нашёл ошибки - Run-Time Check Failure #2 - Stack around the variable '...' was corrupted. Исправил в h[NUM_THREADS] = CreateThread (NULL, 0,(LPTHREAD_START_ROUTINE) findPrimes, (void *)&tnums[i], 0, NULL); на h[NUM_THREADS-1]. Не знаю можно ли так, но ошибка пропала. |
||
03.12.2012, 09:01 | #4 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
|
03.12.2012, 21:06 | #5 |
Регистрация: 30.07.2010
Сообщений: 4
|
Исправил код.
#include "stdafx.h" #include <stdio.h> #include <iostream> #include <windows.h> #include <conio.h> using namespace std; #define NUM_THREADS 4 #define MAX_NUMBERS 1000 #define BLOCKSIZE (MAX_NUMBERS / NUM_THREADS) long primes[MAX_NUMBERS]; int primeCount; DWORD WINAPI findPrimes(void *arg) { long tnum = *(long *)arg; long start = tnum * BLOCKSIZE + 1; long end = tnum * BLOCKSIZE + BLOCKSIZE; long stride = 2; long number, factor; if(start == 1) start += stride; for (number = start; number < end; number += stride ) { factor = 3; while ( (number % factor) != 0 ) factor += 2; if ( factor == number ) { primes[ primeCount ] = number; primeCount++; cout<<number<<endl; } } return 0; } int _tmain(int argc, _TCHAR* argv[]) { int i; long tnums[NUM_THREADS]; HANDLE h[NUM_THREADS]; HANDLE hMutex; hMutex = CreateMutex( NULL, FALSE, NULL); primeCount = 0; primes[primeCount++] = 2; printf( "Determining primes from 1 - %d \n", MAX_NUMBERS); for (i=0; i<NUM_THREADS;++i) { tnums[i] = i; h[NUM_THREADS] = CreateThread (NULL,0,findPrimes,(void*)&tnums[i],0,NULL); cout<<"i="<<tnums[i]<<endl; } DWORD rc; ReleaseMutex(hMutex); printf( "Found %d primes\n", primeCount ); _getch(); return 0; } Всё бы хорошо но есть два небольших недочёта:1) h[NUM_THREADS]=CreatThread(...) оставил как в принципе и должно быть что и вернуло ошибку Run-Time Check Failure #2 - Stack around the variable 'h' was corrupted. 2) так же есть вывод простых чисел но не всех(на промежутке от 1 до 100 пропущено 11 простых чисел и ещё 15 выводятся может быть дело даже в алгоритме?). Также не знаю правильно ли использовал мьютексы. Последний раз редактировалось bors4; 03.12.2012 в 21:10. |
04.12.2012, 00:08 | #6 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,342
|
h[NUM_THREADS] - это за пределами массива.
|
04.12.2012, 19:36 | #7 |
Регистрация: 30.07.2010
Сообщений: 4
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Поиск всех простых чисел, не превосходящих заданного N | Placebo228 | Общие вопросы C/C++ | 1 | 06.11.2012 22:42 |
Поиск простых чисел | phreaker228 | Помощь студентам | 3 | 03.06.2012 15:24 |
Поиск простых чисел + поток (C++) | Brabus | Помощь студентам | 4 | 30.09.2011 08:46 |
Поиск простых чисел из диапазона | dex92 | Помощь студентам | 2 | 21.05.2010 09:40 |
поиск простых чисел методом решета.программа на С или С++ | из_семи | Помощь студентам | 2 | 25.02.2009 20:56 |