注册 登录
编程论坛 C语言论坛

请问以下程序是2线程,还是3线程?

yuma 发布于 2020-10-02 19:56, 2009 次点击
请问以下程序是2线程,还是3线程?代码还可以再简单点不?

程序代码:
//最简单的创建多线程实例   
#include <stdio.h>   
#include <windows.h>   
//子线程函数 A  
DWORD WINAPI ThreadFunA(LPVOID pM)  
{  
    printf("子线程A的线程ID号为:%d\n子线程A输出Hello World\n", GetCurrentThreadId());  
    return 0;  
}
//子线程函数 B
DWORD WINAPI ThreadFunB(LPVOID pM)  
{  
    printf("子线程B的线程ID号为:%d\n子线程B输出Hello World\n", GetCurrentThreadId());  
    return 0;  
}
//主函数,所谓主函数其实就是主线程执行的函数。   
int main()  
{  
    printf("最简单的创建多线程实例\n");  
  
    HANDLE handleA = CreateThread(NULL, 0, ThreadFunA, NULL, 0, NULL);  
    WaitForSingleObject(handleA, INFINITE);  
    HANDLE handleB = CreateThread(NULL, 0, ThreadFunB, NULL, 0, NULL);  
    WaitForSingleObject(handleB, INFINITE);  
    system("pause");  
}  
6 回复
#2
吹水佬2020-10-02 20:48
程序代码:
#include <stdio.h>
#include <windows.h>
//子线程函数 A
DWORD WINAPI ThreadFun(LPVOID pM)
{
    printf("子线程 %d 的线程ID号为:%d,输出 Hello World\n", (int)pM,GetCurrentThreadId());
    return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
    printf("最简单的创建多线程实例\n");
    printf("主线程的线程ID号为:%d,输出 Hello World\n", GetCurrentThreadId());
    CreateThread(NULL, 0, ThreadFun, (LPVOID)1, 0, NULL);
    CreateThread(NULL, 0, ThreadFun, (LPVOID)2, 0, NULL);
    system("pause");
}
#3
yuma2020-10-03 11:22
我想问一下,它到底是2线程的,还是3线程的,为什么?
#4
吹水佬2020-10-03 11:44
以下是引用yuma在2020-10-3 11:22:40的发言:

我想问一下,它到底是2线程的,还是3线程的,为什么?

一个主线程两个子线程
#5
yuma2020-10-05 08:27
以下是引用吹水佬在2020-10-2 20:48:14的发言:

#include <stdio.h>
#include <windows.h>
//子线程函数 A
DWORD WINAPI ThreadFun(LPVOID pM)
{
    printf("子线程 %d 的线程ID号为:%d,输出 Hello World\n", (int)pM,GetCurrentThreadId());
    return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
    printf("最简单的创建多线程实例\n");
    printf("主线程的线程ID号为:%d,输出 Hello World\n", GetCurrentThreadId());
    CreateThread(NULL, 0, ThreadFun, (LPVOID)1, 0, NULL);
    CreateThread(NULL, 0, ThreadFun, (LPVOID)2, 0, NULL);
    system("pause");
}


只有本站会员才能查看附件,请 登录

线程1或线程2会输出2次,不知为什么?
#6
吹水佬2020-10-05 15:57
回复 5楼 yuma
多线程实际应用中,类似用printf输出到同一个设备,要考虑线程同步的问题。
用于线程间同步的对象一般有:事件对象、临界区对象、互斥量对象和信号灯对象等。
试试用事件对象:
程序代码:
#include <stdio.h>
#include <windows.h>
HANDLE hEvent;
//子线程函数
DWORD WINAPI ThreadFun(LPVOID pM)
{
    WaitForSingleObject(hEvent, INFINITE);
    printf("子线程 %d 的线程ID号为:%d,输出 Hello World\n", (int)pM,GetCurrentThreadId());
    SetEvent(hEvent);
    //Sleep(50);
    return 0;
}
//主函数,所谓主函数其实就是主线程执行的函数。
int main()
{
    hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
    printf("最简单的创建多线程实例\n");
    printf("主线程的线程ID号为:%d,输出 Hello World\n", GetCurrentThreadId());
    CreateThread(NULL, 0, ThreadFun, (LPVOID)1, 0, NULL);
    CreateThread(NULL, 0, ThreadFun, (LPVOID)2, 0, NULL);
    CloseHandle(hEvent);
    system("pause");
}
#7
yuma2020-10-05 17:04
回复 6楼 吹水佬
感谢,很好的多线程实例。
1