利用互斥机制和同步机制实现,抢票过程,具体要求:张三线程买了5张票后,李四的线程再买5张票,两个线程执行有先后顺序,代码
解决方案:
在实现抢票过程中,需要使用互斥锁和条件变量来保证线程的同步和互斥。具体实现步骤如下:
c在上述代码中,线程1首先获取mutex1锁,然后判断ticket_num是否大于等于5,如果是,则执行购票操作,将ticket_num减去5,然后释放mutex1锁,并唤醒cond2条件变量,等待线程2执行。线程2首先获取mutex2锁,然后等待cond2条件变量的唤醒,一旦被唤醒,判断ticket_num是否大于等于5,如果是,则执行购票操作,将ticket_num减去5,然后释放mutex2锁,并唤醒cond1条件变量,等待线程1执行。主函数中创建两个线程,分别执行thread1和thread2函数,然后等待两个线程执行完毕,最后输出剩余票数。
#include
#include
#include int ticket_num = 10;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER;
pthread_cond_t cond2 = PTHREAD_COND_INITIALIZER; void *thread1(void *arg)
{
pthread_mutex_lock(&mutex1);
while (ticket_num >= 5) {
ticket_num -= 5;
printf("Thread1 bought 5 tickets, %d tickets left.\
", ticket_num);
pthread_cond_signal(&cond2);
pthread_cond_wait(&cond1, &mutex1);
}
pthread_mutex_unlock(&mutex1);
pthread_exit(NULL);
} void *thread2(void *arg)
{
pthread_mutex_lock(&mutex2);
pthread_cond_wait(&cond2, &mutex2);
while (ticket_num >= 5) {
ticket_num -= 5;
printf("Thread2 bought 5 tickets, %d tickets left.\
", ticket_num);
pthread_cond_signal(&cond1);
pthread_cond_wait(&cond2, &mutex2);
}
pthread_mutex_unlock(&mutex2);
pthread_exit(NULL);
} int main()
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf("Remaining tickets: %d\
", ticket_num);
return 0;
}
参考GPT和自己的思路:题目要求利用互斥和同步机制实现抢票过程,具体要求是张三线程买了5张票后,李四的线程再买5张票,并且这两个线程的执行顺序有先后顺序。
下面是一个可以实现该功能的示例代码:
import java.util.concurrent.locks.*;
public class Main {
public static void main(String[] args) {
// 创建一把可重入锁
ReentrantLock lock = new ReentrantLock();
// 创建条件变量
Condition condition = lock.newCondition();
// 创建票数变量
int tickets = 10;
// 创建张三线程
Thread t1 = new Thread(() -> {
try {
// 上锁
lock.lock();
while(tickets < 5) {
// 如果票数少于5,就等待
condition.await();
}
// 张三买5张票
tickets -= 5;
System.out.println(Thread.currentThread().getName() + "买了5张票,剩余票数:" + tickets);
// 唤醒其他线程
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
});
// 创建李四线程
Thread t2 = new Thread(() -> {
try {
// 上锁
lock.lock();
while(tickets < 5) {
// 如果票数少于5,就等待
condition.await();
}
// 李四买5张票
tickets -= 5;
System.out.println(Thread.currentThread().getName() + "买了5张票,剩余票数:" + tickets);
// 唤醒其他线程
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
});
// 先启动张三线程
t1.start();
try {
// 等待张三线程执行完成
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 再启动李四线程
t2.start();
try {
// 等待李四线程执行完成
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
该代码中使用了可重入锁和条件变量实现了互斥和同步机制。具体实现过程如下:
创建一把可重入锁和一个条件变量。
创建一个票数变量,初始赋值为10。
创建张三线程和李四线程。
张三线程先通过lock.lock()方法上锁,判断票数是否达到5张,如果未达到则通过condition.await()方法等待,否则买5张票并输出结果,并通过condition.signalAll()方法唤醒其他线程。
李四线程通过lock.lock()方法上锁,同样判断票数是否达到5张,如果未达到则通过condition.await()方法等待,否则买5张票并输出结果,并通过condition.signalAll()方法唤醒其他线程。
主线程先启动张三线程,并通过join()方法等待其执行完毕。
主线程再启动李四线程,并同样通过join()方法等待其执行完毕。
通过以上步骤,就实现了张三线程抢5张票后,李四线程再抢5张票并保证了执行顺序。