65,208
社区成员
发帖
与我相关
我的任务
分享#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <process.h>
#include <string>
#include <vector>
typedef struct ThreadArg
{
int request_num;
unsigned long thread_no;
std::string request_msg;
ThreadArg()
{
request_num = 0;
thread_no = 0;
request_msg = "";
}
}ThreadArg;
DWORD WINAPI func(LPVOID arg)
{
ThreadArg *tharg = (ThreadArg*)arg;
std::cout<<tharg->thread_no<<std::endl;
return 0;
}
int main()
{
for(int i = 0; i < 10; i++)
{
ThreadArg tharg;
tharg.thread_no = i;
HANDLE worker = CreateThread(NULL, 0, func, &ThreadArg, 0, NULL);
}
}
int main()
{
ThreadArg TArg[10];
for(int i = 0; i < 10; i++)
{
TArg[i].thread_no = i;
HANDLE worker = CreateThread(NULL, 0, func, (LPVOID)&TArg[i], 0, NULL);
}
Sleep(5000);
return 0;
}
在主线程作用域中创建一个数组用于将数组每个元素分别传递给每个子线程,创建完子线程后,主线程等待一会让子线程进行输出;
由于线程调度是不可控的,因此这里输出的顺序是混乱的,而且每个子线程输出数字后,有可能还没来得及输出endl时,OS就开始调度其它子线程了,因此输出顺序和格式可能每次都不一样;如下图所示,就将1和8输出在同一行了:
[/quote]
感谢你解决了我的问题,原来输出错误是因为线程调度的问题,我在子线程输出的地方加了把锁,输出果然正常了,感谢你和二楼的lianshaohua。
int main()
{
ThreadArg TArg[10];
for(int i = 0; i < 10; i++)
{
TArg[i].thread_no = i;
HANDLE worker = CreateThread(NULL, 0, func, (LPVOID)&TArg[i], 0, NULL);
}
Sleep(5000);
return 0;
}
[/quote]
int main()
{
ThreadArg TArg[10];
for(int i = 0; i < 10; i++)
{
TArg[i].thread_no = i;
HANDLE worker = CreateThread(NULL, 0, func, (LPVOID)&TArg[i], 0, NULL);
}
Sleep(5000);
return 0;
}

#include <WinSock2.h>
#include <Windows.h>
#include <iostream>
#include <process.h>
#include <string>
#include <vector>
typedef struct ThreadArg
{
int request_num;
unsigned long thread_no;
std::string request_msg;
ThreadArg()
{
request_num = 0;
thread_no = 0;
request_msg = "";
}
}ThreadArg;
DWORD WINAPI func(LPVOID arg)
{
ThreadArg *tharg = (ThreadArg*)arg;
std::cout<<tharg->thread_no<<std::endl;
return 0;
}
int main()
{
ThreadArg *thargs = new ThreadArg[100];
for(int i = 0; i < 100; i++)
{
thargs[i].thread_no = i;
HANDLE worker = CreateThread(NULL, 0, func, &thargs[i], 0, NULL);
}
Sleep(10000);
delete[] thargs;
return 0;
}
不能正确输出0-99!