Я думаю, что Tiw указал на вашу первую проблему, но есть несколько.
Вот обновленная версия вашего кода с некоторыми комментариями, объясняющими, почему было сделано изменение.
Я также включил более рубиновую версию.
def jotto()
file_content = File.readlines("words.txt")
i = 0
new_array = []
while i < file_content.length
temp_str = file_content[i].chomp #added
if temp_str.length == 4
new_array << temp_str
end
i = i + 1
end
answer = new_array[rand(new_array.length)]
puts(answer)
puts "Guess the secret word"
# you need to get the word from the user inside the while loop.
# word = gets
# word_array = []
# word_array << word # This adds the word to an array of strings .. you want to turn the string into an array of characters
#i = 0 # not used
# added
word = nil
while answer != word
#added
word = gets.chomp
word_array = word.chars # see comment above
iterations = 0
w = 0
while iterations < word.length # was <=
if answer.include? word_array[iterations] # == true
w = w + 1
end
iterations = iterations + 1
end
puts("That's not correct but there are " + w.to_s + " of the same letters") if word != answer # there are better ways.
end
print("Yes! " + answer + " is the right answer!")
end
jotto()
Более рубиновый способ ведения дел
def jotto()
answer_list = File.readlines("words.txt").map { |line| line.strip } # map each read line into an array of strings without any whitespace
answer = answer_list.sample # get a random element
puts answer #for debug only
puts "Guess the secret word"
loop do
guess = gets.strip
break if guess == answer # exit the loop if correct
# map each char in answer to an array of true/false depending on if it matches the guess position
matched_positions = answer.chars.each_with_index.map { |char ,index| char == guess[index] }
number_of_matching_positions = matched_positions.count(true) # count the number of true entires (positions that matched)
puts("That's not correct but there you did match #{number_of_matching_positions} positions - try again")
end
puts "Yes! " + answer + " is the right answer!"
end
jotto()
Microsoft работает над рядом технологий для следующей Версии Visual Studio 2010, названный Временем выполнения Параллелизма, Параллельной Библиотекой Шаблона и Асинхронной Библиотекой Агентов, которая, вероятно, поможет. Время выполнения Параллелизма предложит основанное на политике планирование, т.е. разрешение Вам управлять и составить несколько экземпляров планировщика (подобный пулам потоков, но с affinitization и выравниванием нагрузки между экземплярами), Параллельная Библиотека Шаблона предложит основанное на задаче программирование и параллельные циклы с STL как модель программирования. Библиотека Agents предлагает основанную на агенте модель программирования и имеет поддержку создания параллельных конвейеров потока данных, т.е. управления теми зависимостями, описанными выше. К сожалению, это еще не выпущено, таким образом, можно читать об этом на нашем блог команды или посмотреть некоторые видео на channel9 существует также очень большой CTP, который доступен для скачивания также.
при поиске решения сегодня Стандартные блоки Потока Intel и библиотека поточной обработки повышения являются и хорошими библиотеками и доступный теперь. JustSoftwareSolutions выпустил реализацию станд.:: поток, который соответствует C++ 0x проект и конечно OpenMP, широко доступен при рассмотрении мелкомодульного основанного на цикле параллелизма.
реальная проблема как другие люди сослалась на, должен правильно определить и разложить работу на задачи, подходящие для параллельного выполнения (т.е. никакое незащищенное общее состояние), понять зависимости между ними и минимизировать конкуренцию, которая может произойти на узких местах (является ли узкое место , общее состояние защиты или обеспечение цикла отправки очереди заданий является низкой конкуренцией или свободный от блокировок)... и сделать это, не планируя детали реализации, просачивающиеся в остальную часть Вашего кода.
- Рик
Что-то хотело бы пул потоков быть полезным для Вас? Это основано на повышении:: потоки и в основном реализуют простую очередь задачи потока, которая выдает функции рабочего к объединенным потокам.
Я прокрутил свое собственное, на основе Boost.threads. Я был вполне удивлен тем, сколько удара я добрался от написания такого небольшого кода. Если Вы не находите, что что-то предварительно сделанное, не боится к самокрутке. Между Boost.threads и Вашим опытом начиная с записи Вашего собственного, это могло бы быть легче, чем Вы помните.
Для предварительно сделанных опций, не забывайте, что Хром лицензируется очень дружественный, таким образом, Вы можете к самокрутке универсальная библиотека вокруг ее кода.
Мы должны были создать нашу собственную систему очереди заданий для соответствия требованиям, подобным Вашей (поток UI должен всегда отвечать в 33 мс, задания могут работать от 15-15000ms), потому что действительно не было ничего там, которое вполне удовлетворило наши потребности, уже не говоря о было производительно.
, К сожалению, наш код является почти столь же собственным, как собственный добирается, но я могу дать Вам некоторые самые существенные функции:
Собираются, все необходимые данные для задания в сам объект задания - стараются не иметь указатель от задания назад в основную "кучу", где необходимо будет иметь дело с конкуренцией между заданиями и блокировками и всем что другой медленный, раздражающий материал. Например, все параметры моделирования должны войти в локальный блоб данных задания. Структура результатов, очевидно, должна быть чем-то, что переживает задание: можно иметь дело с этим любой путем a) зависания на объекты задания даже после того, как они закончили работать (таким образом, можно использовать их содержание от основного потока), или b) выделения структуры результатов особенно для каждого задания и наполнения указателя в объект данных задания. Даже при том, что сами результаты не будут жить в задании, это эффективно предоставляет эксклюзивный доступ задания к его выходной памяти, таким образом, Вы не должны путать с блокировками.
На самом деле я упрощаю немного выше, так как мы должны поставить балеты точно, какие задания, на которых работают, который ядра, таким образом, каждое ядро получает свою собственную очередь заданий, но это является, вероятно, ненужным для Вас.
Вы могли бы хотеть посмотреть Поточно-ориентированное программирование - оно основано на потоковой передаче блоков данных между асинхронными компонентами. Существует Java и версии C# драйвера плюс много предварительно кодированных компонентов. Это является внутренне многопоточным - на самом деле, единственный однопоточный код в компонентах, хотя можно добавить ограничения синхронизации к стандартным правилам планирования. Хотя это может быть на слишком мелкомодульном уровне для того, в чем Вы нуждаетесь, может быть материал здесь, можно использовать.
Смотрите на повышение:: будущее (но видят также этот обсуждение и предложение ), который похож на действительно хорошую основу для параллелизма (в особенности это, кажется, предлагает превосходную поддержку ситуаций с типом C-depends-on-A-and-B).
я посмотрел на OpenMP немного, но (как Вы) не был убежден, что он будет работать хорошо на что-либо кроме цифрового кода Fortran/C. Intel Стандартные блоки Поточной обработки выглядел более интересным мне.
, Если это прибывает в него, это не слишком твердо к самокрутка сверх повышения:: поток. [Объяснение: поток ферма (большинство людей назвало бы это пулом) привлекает работу из ориентированного на многопотоковое исполнение очередь из функторов (задачи или задания). Посмотрите тесты и сравнительный тест для примеров использования. У меня есть некоторая дополнительная сложность к (дополнительно) задачам поддержки с приоритетами и случай, где выполнение задач может породить больше задач в очередь заданий (это делает знание, когда вся работа на самом деле завершается немного более проблематичная; ссылки на "ожидание" - те, которые могут иметь дело со случаем). Мог бы дать Вам некоторое представление так или иначе.]
Вы хотели бы смотреть Intel Thread Building Blocks . Я beleave, это делает то, что Вы хотите и с версией 2, это - Открытый исходный код.
Существует много распределенных менеджеров ресурсов там. Программное обеспечение, которое отвечает почти всем Вашим требованиям, Механизм Сетки Sun . SGE используется на некоторых мирах самые большие суперкомпьютеры и находится в активной разработке.
существуют также аналогичные решения в Крутящий момент , платформа LSF , и Кондор .
Это кажется, что можно хотеть к самокрутке, но существует много функциональности во всем вышеупомянутом.
Я не знаю, ищете ли Вы библиотеку C++ (который я думаю, что Вы), но платформа Ветвления/Соединения Doug Lea для Java 7 довольно изящна, и делает точно, что Вы хотите. Вы, вероятно, смогли бы реализовать его в C++ или найти предварительно реализованную библиотеку.
[еще 112] информация здесь: http://artisans-serverintellect-com.si-eioswww6.com/default.asp?W1
Возможно, немного поздно, но взгляните также на ThreadWeaver: http://en.wikipedia.org/wiki/ThreadWeaver