在Windows下C语言主函数中有两个for循环2次创建线程,其中4个线程两个是相同发送数据线程,另一个是相同接收数据线程,如何保证实现一发一收,并且发送线程1对应接收线程1,C语言代码写一个例程
时间: 2024-12-02 09:14:03 浏览: 14
在Windows环境下,为了实现一对一的数据传输,你可以使用`CreateThread()`函数来创建线程,并利用互斥量(Mutex)来同步线程间的操作,防止数据混乱。这里是一个简单的示例代码:
```c
#include <windows.h>
#include <stdio.h>
// 创建互斥量
HANDLE mutex = CreateMutex(NULL, FALSE, NULL); // 初始化互斥量
// 线程发送数据
DWORD WINAPI send_data(LPVOID lpParam)
{
char data[] = "Hello from sender 1";
DWORD result;
// 获取锁
if (WaitForSingleObject(mutex, INFINITE) != WAIT_OBJECT_0) {
printf("Failed to acquire mutex.\n");
return -1;
}
// 发送数据...
// 实现你的数据发送逻辑...
// 解锁
ReleaseMutex(mutex);
// 打印成功消息
printf("Sender thread 1 finished.\n");
return 0;
}
// 线程接收数据
DWORD WINAPI receive_data(LPVOID lpParam)
{
char buffer[256];
DWORD result;
// 获取锁
if (WaitForSingleObject(mutex, INFINITE) != WAIT_OBJECT_0) {
printf("Failed to acquire mutex.\n");
return -1;
}
// 接收数据...
// 实现你的数据接收并处理逻辑...
// 解锁
ReleaseMutex(mutex);
// 打印成功消息
printf("Receiver thread 1 finished.\n");
return 0;
}
int main()
{
HANDLE thread_send1 = CreateThread(NULL, 0, send_data, NULL, 0, NULL);
HANDLE thread_send2 = CreateThread(NULL, 0, send_data, NULL, 0, NULL);
HANDLE thread_recv1 = CreateThread(NULL, 0, receive_data, NULL, 0, NULL);
HANDLE thread_recv2 = CreateThread(NULL, 0, receive_data, NULL, 0, NULL);
// 检查线程是否创建成功
if (!thread_send1 || !thread_send2 || !thread_recv1 || !thread_recv2)
{
printf("Error creating threads.\n");
return -1;
}
// 等待所有线程完成
WaitForMultipleObjects(4, (HANDLE*) &thread_list, TRUE, INFINITE);
CloseHandle(thread_send1);
CloseHandle(thread_send2);
CloseHandle(thread_recv1);
CloseHandle(thread_recv2);
CloseHandle(mutex);
return 0;
}
```
在这个例子中,我们为发送线程(send_data)和接收线程(receive_data)分别创建了两个实例。每个线程在获取到互斥量后才会执行数据传输部分的操作,确保了一对一的通信。当主线程等待所有线程完成后,关闭所有的资源。
注意:这个代码片段假设有一个全局变量`thread_list`用于存储所有线程句柄,你需要在实际应用中添加适当的数组来管理它们。
阅读全文