13、多线程程序测试

在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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42557786/article/details/108061201