求!
有一个全局数组int arr[]={1,2,3,4,5,6,7,8,9,10},现需要使用两个线程按顺序交替将数组内容打印出来(每个线程打印一次,直到全部打印完),不允许使用延时函数 要实现两个线程交替打印数组中的元素,我们可以使用互斥锁(Mutex)和条件变量(Condition Variable)来同步线程。确保每个线程在正确的时机打印出正确的值。以下是使用C语言实现的简单示例:#include <stdio.h>
#include <pthread.h>
#define SIZE 10
int arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int index = 0;// 用于跟踪打印的数组下标
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int turn = 0;// 用于记录该哪个线程打印,0表示线程1,1表示线程2
void* print_even(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (turn != 0 && index < SIZE) {
pthread_cond_wait(&cond, &mutex);
}
if (index < SIZE) {
printf("Thread 1: %d\n", arr);
index++;
turn = 1;// 切换到线程2
}
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
if (index >= SIZE) break;
}
return NULL;
}
void* print_odd(void* arg) {
while (1) {
pthread_mutex_lock(&mutex);
while (turn != 1 && index < SIZE) {
pthread_cond_wait(&cond, &mutex);
}
if (index < SIZE) {
printf("Thread 2: %d\n", arr);
index++;
turn = 0;// 切换到线程1
}
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
if (index >= SIZE) break;
}
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_create(&t1, NULL, print_even, NULL);
pthread_create(&t2, NULL, print_odd, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return 0;
}
解释:
- 使用两个线程 `t1` 和 `t2` 分别调用 `print_even` 和 `print_odd` 函数。
- 线程间通过 `turn` 变量来决定该哪个线程打印。
- `pthread_mutex_lock` 和 `pthread_mutex_unlock` 用于锁定和解锁,以防止打印顺序的错乱。
- `pthread_cond_wait` 和 `pthread_cond_signal` 用来挂起和唤醒线程,实现交替运行。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-10-16 18:15
要实现两个线程交替打印数组中的元素,我们可以使用互斥锁(Mutex)和条件变量(Condition Variable)来同 ...
使用sem_wait还有sem_post实现线程
同步操作 轻语远歌 发表于 2024-10-16 18:26
使用sem_wait还有sem_post实现线程
同步操作
好的,我们可以使用信号量(Semaphore)来实现两个线程的同步,达到交替打印数组的目的。下面是通过C语言使用 `sem_wait` 和 `sem_post` 实现的一个示例:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define SIZE 10
int arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int index = 0;// 用于跟踪打印的数组下标
sem_t sem1, sem2;// 信号量
void* print_even(void* arg) {
while (1) {
sem_wait(&sem1);// 等待信号量1
if (index < SIZE) {
printf("Thread 1: %d\n", arr);
index++;
}
sem_post(&sem2);// 释放信号量2
if (index >= SIZE) break;
}
return NULL;
}
void* print_odd(void* arg) {
while (1) {
sem_wait(&sem2);// 等待信号量2
if (index < SIZE) {
printf("Thread 2: %d\n", arr);
index++;
}
sem_post(&sem1);// 释放信号量1
if (index >= SIZE) break;
}
return NULL;
}
int main() {
pthread_t t1, t2;
// 初始化信号量,sem1初始值为1(让线程1先运行),sem2初始值为0
sem_init(&sem1, 0, 1);
sem_init(&sem2, 0, 0);
// 创建线程
pthread_create(&t1, NULL, print_even, NULL);
pthread_create(&t2, NULL, print_odd, NULL);
// 等待线程结束
pthread_join(t1, NULL);
pthread_join(t2, NULL);
// 销毁信号量
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
解释:
- 信号量 `sem1` 和 `sem2` 用于控制线程执行的顺序。
- `sem1` 初始值为1,表示线程1先可以执行。`sem2` 初始值为0,表示线程2需要等待。
- 在 `print_even` 函数中,`sem_wait(&sem1)` 等待信号量 `sem1`,表示线程1需要运行,然后 `sem_post(&sem2)` 释放信号量2,让线程2可以运行。
- 在 `print_odd` 函数中,`sem_wait(&sem2)` 等待信号量 `sem2`,表示线程2需要运行,然后 `sem_post(&sem1)` 释放信号量1,让线程1可以运行。
- 这样的交替机制确保了两个线程按顺序交替打印数组元素。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]