线程按指定顺序输出字符到数组

题目:

有三个线程,线程1的功能就是向字符数组输出A,线程2的功能就是向字符数组输出B,线程2的功能就是向字符数组输出C,要求按顺序向数组赋值ABCABCABCABC的个数由线程函数1的参数指定。

接口说明:

void Init();  //初始化函数

void Release(); //资源释放函数

unsignedint__stdcall ThreadFun1(PVOID pM)  ; //线程函数1,传入一个int类型的指针,用于初始化输出A次数,资源需要线程释放

unsignedint__stdcall ThreadFun2(PVOID pM)  ;//线程函数2,无参数传入

unsignedint__stdcall ThreadFun3(PVOID pM)  ;//线程函数3,无参数传入

char  g_write[1024]; //线程1,线程2,线程3按到顺序向该数组赋值。不用考虑数组是否越界,测试用例保证


源代码:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>   
#include <process.h>   
#include <windows.h>   

#define MAXHANDLE  3

char  g_write[1028]; //线程1,线程2,线程3按到顺序向该数组赋值
HANDLE g_hThreadEvent[3];
HANDLE handle[MAXHANDLE];
int g_Number;

//线程1函数   
unsigned int __stdcall ThreadFun1(PVOID pM)  
{  
    int uiNumber = *(int *)pM;
    int iLoop    = 0;
    g_Number = uiNumber;
    for (iLoop; iLoop < uiNumber; iLoop++)
    {
        //printf("this is thread 1: %s\n", g_write);
        WaitForSingleObject(g_hThreadEvent[0], INFINITE);
        strcat(g_write, "A");
        SetEvent(g_hThreadEvent[1]);
    }
    _endthreadex(0);
    return 0; 
}  

//线程2函数   
unsigned int __stdcall ThreadFun2(PVOID pM)  
{  
    int iLoop = 0;
    for (iLoop; iLoop < g_Number; iLoop++)
    {
        //printf("this is thread 2: %s\n", g_write);
        WaitForSingleObject(g_hThreadEvent[1], INFINITE);
        strcat(g_write, "B");
        SetEvent(g_hThreadEvent[2]);
    }
    _endthreadex(0);
    return 0;  
}  

//线程3函数   
unsigned int __stdcall ThreadFun3(PVOID pM)  
{  
    int iLoop = 0;
    for (iLoop; iLoop < g_Number; iLoop++)
    {
        //printf("this is thread 2: %s\n", g_write);
        WaitForSingleObject(g_hThreadEvent[2], INFINITE);
        strcat(g_write, "C");
        SetEvent(g_hThreadEvent[0]);
    }
    _endthreadex(0);
    return 0;  
}  

void Init(void)
{
    g_hThreadEvent[0] = CreateEvent(NULL, FALSE, TRUE, NULL);
    g_hThreadEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL);
    g_hThreadEvent[2] = CreateEvent(NULL, FALSE, FALSE, NULL);
    memset(g_write, NULL, sizeof(g_write));
}

void Release(void)
{
    int iLoop = 0; 
    for (int iLoop = 0; iLoop < MAXHANDLE; iLoop++)
    {
        CloseHandle(handle[iLoop]);
    }
}

int main( int Argc, char* Argv[])
{
    int uiNumber = 10;   //需要重复打印的次数
    int *num     = NULL;

    Init();
    num  = (int*)malloc(sizeof(int));
    *num = uiNumber;
    handle[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun1, num, 0, NULL);
    handle[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun2, NULL, 0, NULL);
    handle[2] = (HANDLE)_beginthreadex(NULL, 0, ThreadFun3, NULL, 0, NULL);
    WaitForMultipleObjects(MAXHANDLE, handle, TRUE, INFINITE);
    Release();
    printf("g_write = %s\n", g_write);
    system("pause");
    return 0;
}
### 使用 Java 多线程顺序打印字符数组 在 Java 中,如果需要使用多线程顺序打印一个字符数组,可以通过线程协作机制来实现。例如,使用 `ReentrantLock` 和 `Condition` 来控制线程的执行顺序,确保每个线程在打印自己的元素后,通知下一个线程继续执行。 下面是一个使用两个线程交替打印字符数组的例子: ```java import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; public class OrderedPrintWithThreads { private static final ReentrantLock lock = new ReentrantLock(); private static final Condition condition1 = lock.newCondition(); private static final Condition condition2 = lock.newCondition(); private static final String[] array = {"A", "B", "C", "D", "E"}; private static volatile int state = 0; public static void main(String[] args) { Thread thread1 = new Thread(() -> { for (int i = 0; i < array.length; i += 2) { lock.lock(); try { while (state != 0) { condition1.await(); } System.out.println(Thread.currentThread().getName() + ": " + array[i]); state = 1; condition2.signal(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } }, "Thread-1"); Thread thread2 = new Thread(() -> { for (int i = 1; i < array.length; i += 2) { lock.lock(); try { while (state != 1) { condition2.await(); } System.out.println(Thread.currentThread().getName() + ": " + array[i]); state = 0; condition1.signal(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { lock.unlock(); } } }, "Thread-2"); thread1.start(); thread2.start(); } } ``` 上述代码中,两个线程通过 `ReentrantLock` 和 `Condition` 实现了对数组元素的交替访问和打印。线程1负责打印索引为偶数的元素,线程2负责打印索引为奇数的元素。通过 `condition1` 和 `condition2` 的等待和通知机制,实现了线程间的协作,确保了数组元素的顺序打印[^4]。 ### 使用线程池实现顺序打印 如果使用线程池来实现按顺序打印字符数组,可以结合 `CountDownLatch` 或 `CyclicBarrier` 来协调线程之间的执行顺序。下面是一个使用 `ExecutorService` 和 `CountDownLatch` 的示例: ```java import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class OrderedPrintWithThreadPool { private static final String[] array = {"A", "B", "C", "D", "E"}; private static final CountDownLatch[] latches = new CountDownLatch[array.length]; public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(5); for (int i = 0; i < array.length; i++) { latches[i] = new CountDownLatch(1); final int index = i; executor.submit(() -> { try { if (index > 0) { latches[index - 1].await(); // 等待前一个任务完成 } System.out.println(Thread.currentThread().getName() + ": " + array[index]); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { latches[index].countDown(); // 当前任务完成 } }); } for (CountDownLatch latch : latches) { try { latch.await(); // 等待所有任务完成 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } executor.shutdown(); } } ``` 在这个示例中,每个任务在提交给线程池之前,都会创建一个 `CountDownLatch`,并在任务执行完毕后调用 `countDown()` 方法。每个任务在执行时会等待前一个任务的 `CountDownLatch` 被触发,从而确保了任务的顺序执行。这种方式可以有效地控制线程间的执行顺序,确保字符数组的元素按顺序打印。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值