师父给出了另外一道题:
给一个数,然后开5个线程对它进行相减,直到这个数为0或小于0为止;
我用多线程实现如下:
// methods.c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
int sum;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void * thread1(void *);
void * thread2(void *);
void * thread3(void *);
void * thread4(void *);
void * thread5(void *);
int main(int argc, char * argv[])
{
pthread_t tid1, tid2, tid3, tid4, tid5;
int rc1 = 0, rc2 = 0, rc3 = 0, rc4 = 0, rc5 = 0;
printf("enter main\n");
printf("Please input a number : \n");
scanf("%d", &sum);
while (sum >= 0)
{
rc1 = pthread_create(&tid1, NULL, thread1, NULL);
if (rc1 != 0)
printf("The thread1-create is failed!\n");
rc2 = pthread_create(&tid2, NULL, thread2, NULL);
if (rc2 != 0)
printf("The thread2-create is failed!\n");
rc3 = pthread_create(&tid3, NULL, thread3, NULL);
if (rc3 != 0)
printf("The thread3-create is failed!\n");
rc4 = pthread_create(&tid4, NULL, thread4, NULL);
if (rc4 != 0)
printf("The thread4-create is failed!\n");
rc5 = pthread_create(&tid5, NULL, thread5, NULL);
if (rc5 != 0)
printf("The thread5-create is failed!\n");
pthread_cond_wait(&cond, &mutex);
}
printf("leave main\n");
exit(0);
}
void * thread1(void * arg)
{
printf("enter thread1\n");
pthread_mutex_lock(&mutex);
if (sum <= 0)
exit(0);
else
printf("this is thread1, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_cond_signal(&cond);
sum -= 1;
printf("this is thread1, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_mutex_unlock(&mutex);
printf("leave thread1\n");
pthread_exit(0);
}
void * thread2(void * arg)
{
printf("enter thread2\n");
pthread_mutex_lock(&mutex);
if (sum <= 0)
exit(0);
else
printf("this is thread2, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_cond_signal(&cond);
sum -= 2;
printf("this is thread2, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_mutex_unlock(&mutex);
printf("leave thread2\n");
pthread_exit(0);
}
void * thread3(void * arg)
{
printf("enter thread3\n");
pthread_mutex_lock(&mutex);
if (sum <= 0)
exit(0);
else
printf("this is thread3, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_cond_signal(&cond);
sum -= 3;
printf("this is thread3, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_mutex_unlock(&mutex);
printf("leave thread3\n");
pthread_exit(0);
}
void * thread4(void * arg)
{
printf("enter thread4\n");
pthread_mutex_lock(&mutex);
if (sum <= 0)
exit(0);
else
printf("this is thread4, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_cond_signal(&cond);
sum -= 4;
printf("this is thread4, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_mutex_unlock(&mutex);
printf("leave thread4\n");
pthread_exit(0);
}
void * thread5(void * arg)
{
printf("enter thread5\n");
pthread_mutex_lock(&mutex);
if (sum <= 0)
exit(0);
else
printf("this is thread5, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_cond_signal(&cond);
sum -= 5;
printf("this is thread5, sum : %d, thread id is %u\n", sum,
(unsigned int)pthread_self());
pthread_mutex_unlock(&mutex);
printf("leave thread5\n");
pthread_exit(0);
}
以下是运行结果,只截取了部分,因为结果过长:
- 大小: 402 KB
分享到:
相关推荐
在这个多线程计算器项目中,可能包含了4种不同的计算方法,比如加法、减法、乘法和除法。每种方法被实现为一个独立的线程,这样当用户同时发起多个计算请求时,每个计算可以在各自的线程上并行运行,大大提高了计算...
本文将深入探讨如何使用Java实现一个多线程购票系统,并涉及同步锁机制以及集合的减法操作。 首先,我们要创建一个`Ticket`类,代表票务对象,包含票号和座位信息。这个类应该包含必要的属性和方法,例如获取和设置...
3. **线程的同步**:当多线程访问共享资源时,可能会出现竞态条件。C#提供了一些同步机制,如`lock`语句、`Monitor`类、`Mutex`、`Semaphore`等,来确保线程安全。例如,使用`lock`确保同一时间只有一个线程访问某个...
鱼刺类_多线程应用 - 更新日志 5.4.3(2017-12-01) *修正 修正鱼刺类_线程池Ex/线程池Ex一处很难被触发的BUG *修改 去除所有用到取启动时间的函数/方法 (修正在系统开机超过29天的机器上可能会出现问题) *修正 类回调...
DELPHI,作为一款强大的面向对象的编程语言和集成开发环境,因其高效的代码生成和直观的可视...随着你对Delphi的深入学习,你可以尝试更复杂的操作,比如处理浮点数、错误处理、多线程计算等,进一步提升你的编程技能。
在多线程编程中,同步是至关重要的,它确保了多个线程对共享资源的访问是有序和安全的。在Python中,`threading.Event`是一个实用的工具,用于线程间的通信和同步。本篇文章将深入探讨如何利用`Event`对象来控制线程...
- **多线程支持**: TCL支持多线程编程。 - **线程创建**: 使用 `thread::create` 命令来创建新的线程。 - **线程同步**: 提供了锁机制来同步线程之间的操作。 #### 例子: ```tcl package require thread thread::...
鱼刺类_多线程应用 - 更新日志 5.4.3(2017-12-01) *修正 修正鱼刺类_线程池Ex/线程池Ex一处很难被触发的BUG *修改 去除所有用到取启动时间的函数/方法 (修正在系统开机超过29天的机器上可能会出现问题) *修正 类回调...
3. **多线程编程**:在Windows平台上,这通常涉及到`CreateThread`、`WaitForMultipleObjects`等API的使用,以创建和管理线程。同时,要确保线程安全,避免竞态条件和死锁,可能需要使用互斥量(mutex)、信号量...
在该程序中,我们可以看到Java多线程编程的基本概念,包括线程的创建、线程的启动、线程的睡眠等。该程序也展示了Java中如何使用SimpleDateFormat类来格式化日期和时间的输出。 图形用户界面编程 在第一章实验二中...
在.NET框架中,C#是一种常用的编程语言,用于构建各种应用程序。Visual Studio 2005(VS2005)是开发这些应用的集成开发...通过实践,你可以进一步探索DLL的高级特性,如延迟加载、版本控制以及多线程环境下的使用等。
通过这种方式,我们可以为Calculator应用创建多个测试用例,覆盖其各种功能,确保它们在不同的场景下都能正常工作。同时,Robotium还支持多线程测试、等待条件以及日志记录等功能,使得测试更加灵活和全面。 在实际...
5. **多线程编程**:虽然标题提及进程与线程,但在描述中并未直接涉及,但如果是计算密集型任务,多线程并行计算可能是提高效率的一种方式,所以理解C++中的线程概念和`<thread>`库的使用也是重要知识点。...
例如,他们可能需要创建一个程序,模拟键盘输入和屏幕输出,以此来学习数据传输的过程。 再者,实验4可能涵盖了处理器架构和指令集。学生可能需要设计并实现一个简单的处理器模型,通过编程模拟其工作,这通常涉及...
7. **线程安全**:Eigen库是线程不安全的,但提供了`Eigen::DenseBase::eval()`函数来确保在多线程环境中正确同步计算。此外,用户也可以自定义内存池来进一步优化多线程性能。 8. **跨平台**:Eigen库是跨平台的,...
对于整型的原子变量,`std::atomic`还提供了`fetch_add()`、`fetch_sub()`、`++`和`--`等操作,它们在多线程环境下安全地实现了加法和减法。 5. **原子指针操作(Atomic Pointer Operations)** `std::atomic`...
- **多线程编程**:`timm_osal_mutex`表明程序可能涉及多线程环境,需要同步机制来保护共享资源的安全。 - **互斥锁(Mutex)**:作为一种同步原语,用于控制对共享资源的访问,防止多个线程同时修改同一数据,保证...