Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 13
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    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 tham gia
    Sep 2015
    Bài viết
    0
    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

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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á [IMG]images/smilies/smile.png[/IMG]

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cám ơn bạn nhiều!bạn làm giúp mình một tý nhé

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    dùng Event dễ hơn
    dùng các hàm waitforsingleobject, CreateEvent,OpenEvent để thao tác

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    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"[IMG]images/smilies/wink.png[/IMG]


    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 tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi kidkid
    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 ?

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    oh, J. Đoạn này thì sợ ThanSauTK chưa cần dùng đến, chắc cậu ấy đang làm bài tập HDH -> mutex, event, semaphore. nhỉ ?

    Trong Critical Section có sẵn các hàm để xử lý như init,enter,leave,delete, chỉ là không biết nó hiện thực như thế nào ?

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Hàm void hienthi() của bạn không đúng prototype của ThreadProc:
    Mã:
    DWORD WINAPI ThreadProc(LPVOID lpParam)
    Vì vậy stack của ct sẽ bị corrup, may cho bạn là ct của bạn chỉ là đoạn code nhỏ, không phát hiện ra.
    Trong C/C++, nên dùng beginthreadex nếu bạn build ct của bạn với multithread lib/dll của CRT.

    Đoạn code trên của bạn tui modify lại, dùng CritialSection và build ở mode static lib:

    Mã:
    #include <windows.h>#include <stdio.h> CRITICAL_SECTION g_cts = { 0 }; DWORD WINAPI ThreadProc(LPVOID lpParam){    DWORD dwThreadID = *((LPDWORD) lpParam);     for (int i = 0; i < 100; i++)    {        EnterCriticalSection(&g_cts);        printf("ThreadID: %d - i = %d
    ", dwThreadID, i);        LeaveCriticalSection(&g_cts);    }     return 0;} int main(int argc, char* argv[]){    HANDLE h[5] = { NULL };    DWORD threadId[5] = { 0 };     InitializeCriticalSection(&g_cts);     h[0] = CreateThread(0, 0, ThreadProc, &threadId[0], 0, &threadId[0]);    h[1] = CreateThread(0, 0, ThreadProc, &threadId[1], 0, &threadId[1]);    h[2] = CreateThread(0, 0, ThreadProc, &threadId[2], 0, &threadId[2]);    h[3] = CreateThread(0, 0, ThreadProc, &threadId[3], 0, &threadId[3]);    h[4] = CreateThread(0, 0, ThreadProc, &threadId[4], 0, &threadId[4]);     WaitForMultipleObjects(5, h, TRUE, INFINITE);     DeleteCriticalSection(&g_cts);     return 0;}

  10. #10
    uhm, anh có biết cách hiện thực CritialSection ko ?

    Edit: Anh có thể giải thích vì sao ko đúng cú pháp thì bị corrupt stack ko ? Em chỉ còn mấy công ty mà ko tìm hiểu được. Bạn nào biết thì giúp nhé.

    @: Nghĩ đi nghĩ lại, không biết từ khóa lock trong C# hiện thực bằng cách nào. Mình nó xem như tương tự cho Init,Enter,Leave CriticalSection.
    Cứ "đoán" là dùng mutex hiện thực gg.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •