Tworzenie pętli na wątku jest techniką powszechnie stosowaną w całym programowaniu. Pozwala ona programowi wykorzystać lokalność przestrzenną. Często pętla iteracyjna jest używana do wykonywania obliczeń N razy. Programista musi zdecydować, jak podzielić pracę między wątki. Często osiąga się to poprzez stworzenie tablicy uchwytów wątków. Na przykład, jeśli program musi zapisać liczby do macierzy, może chcieć użyć podejścia wielowątkowego, aby zwiększyć wydajność. Ogólnie rzecz biorąc, najlepiej jest używać wielowątkowości, gdy zadanie nie ma dostępu do tego samego źródła danych, co inne wątki.
Popularnym wzorcem dekompozycji danych dla pętli jest parallelLoop-equalChunks, który zasadniczo przydziela każdemu wątkowi równą liczbę iteracji. Ten wzorzec może być również używany w stylu round-robin, gdzie każdemu wątkowi przypisuje się równą liczbę iteracji w stylu round-robin.
Bardziej zaawansowanym wzorcem dekompozycji danych jest parallelLoop-chunksOf1, który łączy wszystkie wątki z powrotem do procesu jednowątkowego. To podejście jest szczególnie skuteczne, gdy rozmiar każdego chunk’u przekracza liczbę wątków.
Poniższy przykład kodu pokazuje, jak wykorzystać funkcję imap() do uruchamiania współbieżnych pętli for. Funkcja imap dostarcza iterable zadań do wykonania i zwraca wyniki w kolejności wykonania zadania. Zadanie jest wydawane tylko wtedy, gdy pracownicy stają się dostępni. Alternatywnie, imap_unordered() zapewnia tę samą funkcjonalność, ale może być bardziej responsywna.
Podczas implementacji pętli wątkowej, możesz użyć metody pw_thread_loop_new do utworzenia pętli wątkowej. Będziesz musiał podać nazwę dla wątku, oraz obiekt Loop, który chcesz zawinąć. Metoda pw_thread_loop_new() jest wrapperem wokół implementacji Loop.
Funkcja imap_unordered dostarcza wyniki w kolejności wykonania zadań. Jeśli planujesz ukończyć wszystkie zadania w pętli, bardziej efektywne może być użycie funkcji imap_ordered. Na przykład, jeśli masz pętlę, która musi obliczyć liczbę dni w roku, możesz chcieć użyć metody imap_ordered zamiast metody imap_unordered. Różnica polega na tym, że iterable zwrócona przez funkcję imap_ordered jest zwracana natychmiast, podczas gdy funkcja imap_unordered zwraca iterable po wykonaniu wszystkich zadań.
Jeśli tworzysz pętlę na wątku, będziesz musiał również określić długość wątku. Zależy to od rozmiaru haczyka i ubrania, do którego przymocujesz nitkę. Ogólną zasadą jest, aby nić była co najmniej trzykrotnie większa od wielkości gotowej pętli plus dodatkowe trzykrotne wydłużenie do pracy.
Pętle z nici są często używane do tworzenia delikatnych pętli z guzików. Ten ścieg tworzy pętlę na końcu nici i przeciąga igłę przez pętlę na tylną stronę tkaniny. Używając igły z dużym oczkiem, można następnie zawiązać pętle guzikowe na ubraniu. Pętle na guziki powinny być umieszczone tak, aby znajdowały się bliżej szwu szyjnego niż zewnętrznej krawędzi kołnierza.
Podobne tematy