Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: Dùng đa luồng trong C++ sao lại chạy chậm đi! help??

  1. #1
    Ngày gia nhập
    10 2009
    Nơi ở
    ThăngLong.delay(1000);
    Bài viết
    312

    Mặc định Dùng đa luồng trong C++ sao lại chạy chậm đi! help??

    Mình có cái code thế này:
    C++ Code:
    1. #include <windows.h>
    2. #include <process.h>
    3. #include <iostream>
    4. using namespace std;
    5.  
    6.  
    7. unsigned c;
    8.  
    9. unsigned __stdcall ThreadFunc( void* p )
    10. {
    11.     printf( "thread...%d\n", (int)p );
    12.  
    13.     for (int i=0; i<200000000; i++)
    14.         c++;
    15.  
    16.     _endthreadex( 0 );
    17.     return 0;
    18. }
    19.  
    20. unsigned __stdcall ThreadFunc1( void* p )
    21. {
    22.     printf( "thread...%d\n", (int)p );
    23.  
    24.     for (int i=0; i<200000000; i++)
    25.         c++;
    26.  
    27.     _endthreadex( 0 );
    28.     return 0;
    29. }
    30.  
    31. int main()
    32. {
    33.     HANDLE hThread, hThread1;
    34.     unsigned threadID, threadID1;
    35.    
    36.     printf( "Creating thread...\n" );
    37.  
    38.     c=0;
    39.  
    40.     hThread = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc, (void *)0, 0, &threadID );
    41.     hThread1 = (HANDLE)_beginthreadex( NULL, 0, &ThreadFunc1, (void *)1, 0, &threadID1);
    42.    
    43.     WaitForSingleObject( hThread, INFINITE );
    44.     WaitForSingleObject( hThread1, INFINITE );
    45.    
    46.     printf( "-> %d\n", c );
    47.  
    48.     CloseHandle( hThread );
    49.     CloseHandle( hThread1 );
    50.    
    51.     cout << "a\a\n";
    52.    
    53.     int a=0;
    54.    
    55.     for (int i=0; i<2*200000000; i++) a--;
    56.         cout << "f\n\a";
    57.        
    58.     system("pause");
    59. }

    Dùng 2 luồng để tăng c từ 0 -> 400triệu, 2 luồng chạy song song, mỗi thread tăng c lên 200 triệu, lúc xong thì in ra chữ a --> mất tầm 5s.

    Chạy 2 luồng xong thì chạy 1 vòng for tăng a từ 0-> 400 triệu, lúc xong in ra chữ f --> mất tầm 1s

    Không biết sai chỗ nào, mình nghĩ đa luồng phải nhanh hơn chứ nhỉ, đang cần tăng tốc 1 số cái bằng multithreading.

    Anh em vào cho ý kiến.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Ko phải lúc nào tạo thread cũng chạy nhanh hơn và thread ko phải để tăng tốc chương trình. Vấn đề là bạn phải phân chia công việc cho hợp lý. Ví dụ có n công việc ko phụ thuộc lẫn nhau, bạn có thể chia nó ra cho n thread và mỗi thread sẽ thực hiện 1 công việc. Nếu có 2 thread thì thread 1 sẽ làm các công việc từ 0->n/2, thread 2 sẽ thực hiện việc từ n/2->n. Và như thế thì tổng kết quả sẽ ra nhanh hơn.

    Trong ví dụ của bạn, bạn đã hoàn toàn sai khi làm việc với thread. Vì rõ ràng 2 công việc mà bạn giao cho 2 thread làm là như nhau, thậm chí còn phụ thuộc lẫn nhau. Bản chất của việc tăng dần 1 biến là tuyến tính, ko thể phân chia. Vì phép tính tăng lên 1 cần phải biết kết quả trước đó là bao nhiêu. Chưa kể 2 thread cùng tham gia tác động vào biến c dùng chung đôi khi sẽ làm giảm tốc độ và ảnh hưởng kết quả tính toán lẫn nhau. Hơn nữa chương trình của bạn sẽ lại chạy chậm hơn nếu trên cpu chỉ có 1 nhân. Vì 2 thread chạy song song trên cpu 1 nhân chỉ là giả lập và chương trình sẽ tốn thêm thời gian chuyển đổi ngữ cảnh cho thread. Đối với cpu nhiều nhân thì cũng khó xác định bởi vì chương trình này đã vi phạm các quy tắc của thread.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    07 2011
    Bài viết
    160

    1. Nếu CPU của bạn có hơn 1 core thì thường việc chia ra 2 (hoặc nhiều hơn)thread sẽ tăng tốc độ lên 1 ít. Còn nếu 1 core thì tăng thread không tăng tốc, có khi còn giảm.

    2. Lúc chạy đa luồng, chương trình của bạn có 3 threads chứ không phải 2. 2 thread lính toán và 1 main thread.

    3. Bạn sử dụng thư viện boost::thread (boost.org/doc/libs/1_47_0/doc/html/thread.html) có interface thân thiện hơn nhiều, design sáng sủa mà lại portable, không phụ thuộc vào windows.

    4. Vấn đề khác biệt quá lớn như 5s với 1s thì chắc nằm ở chỗ khác rồi. Bạn thử viết lại dùng boost::thread xem kết quả thế nào. Để tạo thread trong boost::thread rất đơn giản:
    C++ Code:
    1.   void f1() {...}
    2.   boost::thread t1(&f1);
    3.   t1.join();
    Ngoài ra bạn cũng thử đưa code đo performance lên xem
    Đã được chỉnh sửa lần cuối bởi fbchicken : 14-08-2011 lúc 05:08 AM.

  4. #4
    Ngày gia nhập
    10 2009
    Nơi ở
    ThăngLong.delay(1000);
    Bài viết
    312

    Chạy pthread trên ubuntu cũng ra tương tự.
    Dù chúng không liên quan đến nhau cũng chạy chậm đi.

    Bác nào ví dụ và chứng minh 1 bài nào đó nó chạy nhanh hơn được không ạ. Thanks các bác góp ý.

    ps: Có khi phải 1 thread đốt cpu còn 1 thread nghi đĩa thì mới nhanh.??

Các đề tài tương tự

  1. Cách làm phần mềm Hỏi người dùng có chắc chắc tắt máy không:
    Gửi bởi Dlean7 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 10-12-2012, 07:26 PM
  2. Bán rọ đá sản phẩm dùng trong kè chắn bảo vệ biển,đường
    Gửi bởi thanhgetecco123 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 27-06-2012, 08:37 AM
  3. Dùng ngắt để in chuỗi trong C không chạy được?
    Gửi bởi warboy trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 12
    Bài viết cuối: 05-03-2012, 09:55 AM
  4. xin hỏi cách chạy ứng dụng Web trên máy khác trong mạng LAN (dùng Modem IP động)
    Gửi bởi xinbat007 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 4
    Bài viết cuối: 03-03-2010, 11:24 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn