-
15-12-2008, 03:33 PM #1Junior Member
- 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;
}
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
View more random threads:
FindNextFile gọi đến hàm nào trong driver??? - Hook bằng CreateRemoteThread ko thấy result
- Hide Window CMD in .Bat ?
- Cài đặt phép quay quanh một điểm trong VC++?
- Cách nào hook API trong ws2_s2.dll hàm Connect?
- CreateFileMapping Trả về Lỗi = 5
- hook keyboard trong VC++ không được :(
- capCaptureStop VFW ghi hình camera trong MFC?
- Không thể phát hiện Windows API bị gọi khi đã Hook API đó trong 1 số trường hợp
- Win32API và C for Window có liên quan đến nhau không?
-
15-12-2008, 03:59 PM #2Junior Member
- 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
-
15-12-2008, 05:48 PM #3Junior Member
- 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]
-
15-12-2008, 06:36 PM #4Junior Member
- 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é
-
22-08-2010, 01:19 PM #5Junior Member
- 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
-
22-08-2010, 02:40 PM #6Junior Member
- 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);
-
22-08-2010, 02:48 PM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi kidkid
-
23-08-2010, 08:27 AM #8Junior Member
- 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 ?
-
23-08-2010, 08:35 AM #9Junior Member
- 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)
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;}
-
23-08-2010, 08:37 AM #10Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
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.
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...