在windows上开启一个线程需要用到一个函数,返回一个handle之类的东西,handle 可以控制线程。
目的,看看多线程在一个进程中的执行情况:
-
实现思路:
先开辟8个线程,之后,把 8个 works 添加到 工作队列中,让线程自己碰运气去执行队列里面的works。 -
其中,8个线程都有各自的id,如果某个线程执行了一次打印,那么就会输出 该线程,并且输出 它执行的work是什么类型。
- 注意:有时候,会用两个线程做同样的事情,此时必须知道,这两个线程可能在不同的core上,只是把内存上的work copy 到寄存器,然后线程去访问内存的 copy份,于是就有了两个线程do the same work,并且自己还把自己的count++;
#include<stdio.h>
#include<windows.h>
#include<stdint-gcc.h>
//let threads to know what to do
struct work_queue_entry{
char *StringToPrint;
};
static uint32_t NextEntryTodo;
static uint32_t EntryCount;
work_queue_entry Entries[256];
static void
PushString(char *String)
{
work_queue_entry *Entry=Entries + EntryCount++;
Entry->StringToPrint =String;
}
struct win32_thread_info{
int logicalThreadIndex;
};
DWORD WINAPI
ThreadProc(LPVOID lpParameter)
{
win32_thread_info *ThreadInfo=(win32_thread_info*)lpParameter;
for(;;)
{
if(NextEntryTodo < EntryCount)
{
int EntryIndex = NextEntryTodo++;
work_queue_entry *entry=Entries + EntryIndex;
char buffer[52];
wsprintf(buffer,"thread %u; %s \n",ThreadInfo->logicalThreadIndex,entry->StringToPrint);
OutputDebugStringA(buffer);
}
}
}
int main(){
char *param="thread started~\n";
win32_thread_info ThreadInfo[8]={
};
for(uint32_t ThreadIndex =0;
ThreadIndex<8;
++ThreadIndex){
win32_thread_info *Info=ThreadInfo + ThreadIndex;
Info->logicalThreadIndex =ThreadIndex;
DWORD ThreadID;
HANDLE ThreadHandle=CreateThread(0,0,ThreadProc,&Info,0,&ThreadID);
CloseHandle(ThreadHandle);
}
PushString("string 0");
PushString("string 1");
PushString("string 2");
PushString("string 3");
PushString("string 4");
PushString("string 5");
PushString("string 6");
PushString("string 7");
return 0;
}