vs2019 c/c++ 多线程实现一个线程控制另一个线程的启停 CreateThread SuspendThread ResumeThread

 

// testprocesscontrol.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define  _CRT_SECURE_NO_WARNINGS

#include <iostream>


using std::string;

#include <winsock2.h>// winsock 2 的头文件和库
#include <MSWSock.h>
#include <Windows.h>
//#include <psapi.h>  
#include <direct.h>
#include <process.h>

#include <iostream>
#include <map>
#include <list>
#include <string>

#include <atomic>
using namespace std;


int flagtest = 0;
HANDLE thread1;//全局变量,用于检测
DWORD WINAPI Thread1(LPVOID lpParameter)
{
    while (1)
    {
        Sleep(1000);
        flagtest = 1;
        std::cout << "thread1 id:  " << GetCurrentThreadId() << "\n";
        flagtest = 2;
        flagtest = 0;

    }
}

HANDLE thread2;//全局变量,用于检测
DWORD WINAPI Thread2(LPVOID lpParameter) {
    while (1)
    {
        Sleep(100000);
    }
}

int flag = 1;
DWORD WINAPI Thread3(LPVOID lpParameter)
{
    int i = 0;
    while (1)
    {
        Sleep(1000);
        i++;
        std::cout << i<<"\tthread2 id:  " << GetCurrentThreadId() << "\n";

        if (i % 5 == 0) {
            while (flagtest > 0) {}
            if (flag == 1) {
                SuspendThread(thread1);
                flag = 0;
                continue;
            }
            else {
                ResumeThread(thread1);
                flag = 1;
                continue;
            }
        }

    }
}
int ThreadTotal = 2;
HANDLE* m_phWorkerThreads;

#include <aclapi.h>
int main()
{

    int res;
    std::cout << "Hello World!\n";
    thread1 = CreateThread(NULL, 0, Thread1, NULL, NULL, NULL);
    thread2 = CreateThread(NULL, 0, Thread3, NULL, NULL, NULL);//THREAD_SUSPEND_RESUME
    m_phWorkerThreads = new HANDLE[ThreadTotal];
    m_phWorkerThreads[0] = thread1;
    m_phWorkerThreads[1] = thread2;

    //WaitForSingleObject(thread2, INFINITE);
    WaitForMultipleObjects(ThreadTotal, m_phWorkerThreads, TRUE, INFINITE);
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

 

注意, SuspendThread 是挂起其中一个程序,此处两个线程同时向控制台输出数据,所以此处存在竞争关系,挂起时候如果被挂起的线程正在占据控制台资源,,,就会导致正在执行的线程无法向控制台输出数据的情况,

有控制台竞争资源就导致各种乱七八糟的东西,因此在使用线程挂起时候一定要注意资源的竞争问题,此处使用 

while (flagtest > 0) {}
避免对控制台的精致

 

//

posted @ 2022-05-19 21:31  小城熊儿  阅读(588)  评论(0编辑  收藏  举报