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á
đây là code của mìnhkhi 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#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;
}
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 đỡ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
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á
cám ơn bạn nhiều!bạn làm giúp mình một tý nhé
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
dùng Event dễ hơn
dùng các hàm waitforsingleobject, CreateEvent,OpenEvent để thao tác
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);
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.
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.
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í