Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 13 kết quả

Đề tài: Chống xung đột Multi - Thread Trong VC++ API

  1. #1
    Ngày gia nhập
    10 2008
    Bài viết
    258

    Mặc định Chống xung đột Multi - Thread Trong VC++ API

    đây là code của mình
    #include "stdafx.h"

    #include<iostream>
    #include<winsock2.h>

    #pragma comment(lib,"wsock32.lib")

    using namespace std;
    void hienthi()
    {

    for(int i=0;i<30;i++)
    cout<<endl<<"het cai nay roi"<<endl;

    }
    int _tmain(int argc, _TCHAR* argv[])
    {
    HANDLE h[100];
    DWORD threadId;
    h[0]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)hienthi, 0,0,&threadId);
    h[1]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)hienthi, 0,0,&threadId);
    h[2]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)hienthi, 0,0,&threadId);
    h[3]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)hienthi, 0,0,&threadId);
    h[4]=CreateThread(0,0,(LPTHREAD_START_ROUTINE)hienthi, 0,0,&threadId);
    WaitForMultipleObjects(5,h,TRUE,INFINITE);
    return 0;
    }
    khi mình chạy chương trình này thì đáng lẽ nó hiện thị mỗi cái thì xuống dòng.nhưng do các thread chạy cùng một lúc nên nó lại bị chèm vào nhau như thế này này
    het cai nay roi
    het cai nay roi
    het cai nay roihet cai nay roihet cai nay roi
    het cai nay roi
    het cai nay roihet cai nay roihet cai nay roihet cai nay roi
    het cai nay roihet cai nay roi
    mình biét là phải dùng semaphone hoặc là mutex để giải quyết nhưng mình đã làm mấy hôm rồi không được.mong các bạn giúp đỡ

  2. #2
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Cái này cậu dùng mutex ( ko phải semaphore), tối mình về nhà mở MSDN tra xem sao, giờ đang ở trường bận quá

  3. #3
    Ngày gia nhập
    10 2008
    Bài viết
    258

    cám ơn bạn nhiều!bạn làm giúp mình một tý nhé

  4. #4
    Ngày gia nhập
    10 2008
    Bài viết
    258

    hu hu.chưa bạn nào có ý tưởng cho mình sao?các bạn góp ý cho mình với

  5. #5
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    dùng Event dễ hơn
    dùng các hàm waitforsingleobject, CreateEvent,OpenEvent để thao tác

  6. #6
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Mặc định Chống xung đột Multi - Thread Trong VC++ API

    oh lâu quá, mình hứa giúp cậu ThanSauTK mà rồi quên luôn.

    1. Alex nói dùng CreateEvent để xử lý, chỗ này mình không đồng ý, mục đích của CreateEvent là để xử lý đồng bộ ở việc chờ đợi giữa các thread.

    Ví dụ đoạn code sau:

    void A()
    {
    Thread[] ListThread; // Danh Sách Các Thread Dùng Đọc File Lớn
    ListThread.StartAllThread(); // Start Tất Cả Thread
    WaitForAllThread(); // Đợi tất cả thread
    DoAfterReadFile(); // Làm việc gì đó sau khi đọc file.
    }

    Thì lúc này, việc dùng CreateEvent để xử lý cho WaitForAllThread là hợp lý.

    Tuy nhiên với đoạn code của ThanSauTK, thì mình nghĩ phải dùng Mutex, bạn chất của Mutex, là để ngăn ngừa nhiều Thread cùng truy xuất đến tài nguyên cùng lúc ( ở đây là cout<<"abc"


    Với đoạn code trên, chỗ hàm cout<<"xxx"; ThanSauTK có thể thay thế như sau:
    HANDLE hCoutMutex;
    DWOD dwWait;
    hCoutMuTex = CreateMutex(...)
    dwWait = WaitForSingleObject(hCoutMuTex,....);
    for(1 -> n)
    {
    Cout<<""";
    }
    ReleaseMutex(hCoutMutex);

  7. #7
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    Trích dẫn Nguyên bản được gửi bởi kidkid Xem bài viết
    oh lâu quá, mình hứa giúp cậu ThanSauTK mà rồi quên luôn.

    1. Alex nói dùng CreateEvent để xử lý, chỗ này mình không đồng ý, mục đích của CreateEvent là để xử lý đồng bộ ở việc chờ đợi giữa các thread.
    bạn nghĩ Mutex và Event Trong trường hợp này khác nhau gì ?,tại sao trong trường hợp này Mutex được mà Event không được ?
    Đã được chỉnh sửa lần cuối bởi AlexF : 22-08-2010 lúc 09:30 PM.

  8. #8
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Vấn đề không phải chỗ làm được hay ko làm được ?

    Mà là mục đích sử dụng của nó. Event được sử dụng khác, Mutex được sử dụng khác.

    Với trường hợp này của ThanSauTK thì lựa chọn Mutex theo mình là phù hợp hơn.

    Cũng giống như việc bạn muốn vẽ Hình chữ nhật.
    Bạn có thể dùng :

    1. Draw 4 Line.
    2. Draw Region với 4 đỉnh
    3. Draw Shape với 4 đỉnh
    4. Draw Rect

    Tùy cách lựa chọn cho phù hợp với mục đích tiếp theo của bạn.

    Ở đây mình chọn Mutex.

    Còn tại sao mình chọn Mutex, thì như trên đã nói,

    "Khi nhiều Thread cùng truy xuất đến 1 tài nguyên, mà tài nguyên này chỉ có thể dùng tuần tự, hay chỉ 1 thread được dùng", thì lúc này bạn nên sử dụng Mutex.

    Event được tạo ra, với mục đích đồng bộ giữa các thread, ngang hàng, hay không ngang hàng.

    Đó chính là lý do mà Event & Mutex cùng tồn tại.
    Về bản chất Event không dễ hơn Mutex, chỉ là do bạn thấy dễ dùng với WaitForSingle/MultiObject, OpenEvent ... mà thôi.

    Nếu sâu hơn tí với AutoResetEvent hay ManualResetEvent, thì việc thiết kế thread-flow sẽ có nhiều khó khăn.

    P/S Chỉ là do khi làm mình nhận ra vậy, có thể mình sai, bạn có thể tự kiểm nghiệm vào "correct" giúp mình.

  9. #9
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Nếu các thread trong cùng 1 process thì nên dùng CriticalSection, user object, cho nhẹ, nhanh. Mutex, Event, Semaphore... đều là Kernel object.
    Đã được chỉnh sửa lần cuối bởi TQN : 23-08-2010 lúc 01:25 PM.

  10. #10
    Ngày gia nhập
    10 2008
    Bài viết
    258

    thank cách bạn nhiều. cái này mình dùng mutex để lock.( bài này 2 năm rồi ạ hì)
    Anh yêu em hí hí

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

  1. Cách load csdl từ server bằng multi thread không gây xung đột?
    Gửi bởi den sang trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 18-06-2013, 12:10 AM
  2. Tài liệu về multi thread trong C/C++?
    Gửi bởi thansautk trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 7
    Bài viết cuối: 19-03-2013, 01:21 PM
  3. Giới thiệu thread và multi thread trong lập trình C#
    Gửi bởi dieucay555 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 2
    Bài viết cuối: 26-07-2011, 06:16 PM
  4. Rắc rối với multi thread trong việc thu/phát âm.
    Gửi bởi Joker trong diễn đàn Thắc mắc chung
    Trả lời: 1
    Bài viết cuối: 29-03-2011, 10:14 PM
  5. Tài liệu lập trình C++ Cho xin tài liệu về lập trình multi thread trong C nền tảng Win32
    Gửi bởi hahaha12a2 trong diễn đàn Tài liệu, ebooks và công cụ
    Trả lời: 0
    Bài viết cuối: 12-11-2010, 04:35 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