实验二 线程共享进程中的数据

【实验软硬件环境】

Linux、Win11、GCC

【实验目的与内容】

了解线程和进程之间的数据共享关系。创建 一个线程,在线程中更改进程中的数据

在进程中定义全局共享数据,在线程中直接引用该数据进行更改并输出该数据

【实验程序及分析】

Windows系统下

father.cpp文件代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#include <windows.h>

static int count;//定义全局共享数据
DWORD WINAPI ThreadProc(LPVOID IpParameter) { //线程函数,其中规定了线程要做的事
printf("新线程运行!\n\n");
printf("当前进程ID为%d\n\n",GetCurrentThreadId());
for (count = 1; count <= 10; count = count + 2) { //在线程中直接引用count变量进行更改并输出新数据
printf("Now,线程count = %d\n\n", count);
}
printf("线程等待3秒钟...\n\n");
Sleep(3000);//设置3s的等待时间
return 0;//退出运行
}

int main() {
count = 20;
printf("进程运行!\n\n进程count=%d\n\n", count); //显示count变量初值
HANDLE hEvent = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL); //创建新线程并定义相关线程信息
WaitForSingleObject(hEvent, INFINITE); //等待线程运行结束
CloseHandle(hEvent);//关闭句柄
printf("新线程结束!\n");
printf("进程结束!\n\n");
printf("Now,count = %d", count); //显示count变量的最终值
system("pause");
return 0;
}
代码分析
  1. 创建线程

    HANDLE hEvent = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);

    1
    2
    3
    4
    5
    6
    7
    HANDLE WINAPI CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    SIZE_T dwStackSize,
    LPTHREAD_START_ROUTINE lpStartAddress,
    LPVOID lpParameter,
    DWORD dwCreationFlags,
    LPDWORD lpThreadId );

    lpThreadAttributes:表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。

    dwStackSize:表示线程栈空间大小。传入0表示使用默认大小(1MB)。

    lpStartAddress:表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。

    lpParameter:是传给线程函数的参数。

    dwCreationFlags:指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。

    lpThreadId:将返回线程的ID号,传入NULL表示不需要返回该线程ID号。DWORD类型

    线程创建成功返回新线程的句柄 HANDLE 类型

  2. 线程函数

    DWORD WINAPI ThreadProc(LPVOID IpParameter)

    线程函数的规范格式、函数名称(上为ThreadProc)没有限制

  3. 获取当前线程ID

    GetCurrentThreadId()

【实验截图】

image-20220513150217892

【实验心得体会】

掌握了创建线程,大大提升了程序的运行效率