Windows多线程 CreateThread()+结构体

目录

一、初衷

二、代码(C++)


一、初衷

网络上教程不够全面,要么只有CreateThread()的函数定义和简单实用方法,要么是有结构体输入但却不是多线程。

按照下面我写的代码,可以将既有结构体输入,又能执行多线程。

结构体输入的目的是:子线程函数ThreadFunction()输入有一定的讲究,而我们自己写的函数有很多参数输入,这时候可以将我们输入的参数组合起来作为结构体,再输入到ThreadFunction()函数中去。同时我们想要的输出也可以定义到结构体中。以下面代码为例,我们可以将结构体中的a作为输入,b作为输出。

二、代码(C++)

#include <stdio.h>
#include <windows.h>

struct ThreadParameter {
	int a;
	int b;
	char user[10];
	char name[10];
};

DWORD WINAPI ThreadFunction(LPVOID pParam) {
	ThreadParameter *tp = (ThreadParameter *)pParam; //强制转换参数
	char user[10];
	char pass[10];
	strcpy(user, tp->user);
	strcpy(pass, tp->name);
	printf("User = %s pass = %s \r\n", user, pass);
	Sleep(1000);

	tp->b = tp->a + 100;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个使用 Windows API 实现读写锁的示例程序,可以满足您的要求: ```c++ #include <iostream> #include <Windows.h> using namespace std; SRWLOCK srwLock; // 定义读写锁 bool ready = false; // 标志位,表示数据是否准备好 int data = 0; // 共享数据 void writer() { for (int i = 0; i < 10; i++) { AcquireSRWLockExclusive(&srwLock); // 获取写锁 data = i; // 写入数据 ready = true; // 标记数据已经准备好 ReleaseSRWLockExclusive(&srwLock); // 释放写锁 Sleep(100); // 等待一段时间 } } void reader(int id) { while (true) { AcquireSRWLockShared(&srwLock); // 获取读锁 while (!ready) { // 如果数据没准备好,就等待 SleepConditionVariableSRW(&srwLock, &srwLock, INFINITE, CONDITION_VARIABLE_LOCKMODE_SHARED); } cout << "Reader " << id << " read data: " << data << endl; // 读取数据 ready = false; // 标记数据已经被读取 ReleaseSRWLockShared(&srwLock); // 释放读锁 Sleep(500); // 等待一段时间 } } int main() { InitializeSRWLock(&srwLock); // 初始化读写锁 HANDLE hWriter = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)writer, NULL, 0, NULL); // 创建写线程 HANDLE hReader1 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)reader, (LPVOID)1, 0, NULL); // 创建读线程1 HANDLE hReader2 = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)reader, (LPVOID)2, 0, NULL); // 创建读线程2 WaitForSingleObject(hWriter, INFINITE); // 等待写线程结束 WaitForSingleObject(hReader1, INFINITE); // 等待读线程1结束 WaitForSingleObject(hReader2, INFINITE); // 等待读线程2结束 CloseHandle(hWriter); // 关闭写线程句柄 CloseHandle(hReader1); // 关闭读线程1句柄 CloseHandle(hReader2); // 关闭读线程2句柄 return 0; } ``` 在这个程序中,我们使用了 Windows API 中的 `SRWLOCK` 结构体来实现读写锁。写线程通过调用 `AcquireSRWLockExclusive` 函数获取写锁,然后写入数据并释放写锁。读线程通过调用 `AcquireSRWLockShared` 函数获取读锁,然后检查标志位是否为 true,如果为 false,就调用 `SleepConditionVariableSRW` 函数等待通知。读取完数据后,再将标志位设置为 false 并释放读锁。 注意,使用 Windows API 实现读写锁需要注意一些细节,例如写锁的优先级高于读锁,读写锁的使用方式等等。具体可以参考 MSDN 上的相关文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值