`
zhou347742
  • 浏览: 9940 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
最近访客 更多访客>>
社区版块
存档分类
最新评论

创建多线程做减法

阅读更多

师父给出了另外一道题:

给一个数,然后开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
1
2
分享到:
评论

相关推荐

    C#编写的多线程计算器

    在这个多线程计算器项目中,可能包含了4种不同的计算方法,比如加法、减法、乘法和除法。每种方法被实现为一个独立的线程,这样当用户同时发起多个计算请求时,每个计算可以在各自的线程上并行运行,大大提高了计算...

    java实现多线程购票系统

    本文将深入探讨如何使用Java实现一个多线程购票系统,并涉及同步锁机制以及集合的减法操作。 首先,我们要创建一个`Ticket`类,代表票务对象,包含票号和座位信息。这个类应该包含必要的属性和方法,例如获取和设置...

    自己做的一个C#线程的例子

    3. **线程的同步**:当多线程访问共享资源时,可能会出现竞态条件。C#提供了一些同步机制,如`lock`语句、`Monitor`类、`Mutex`、`Semaphore`等,来确保线程安全。例如,使用`lock`确保同一时间只有一个线程访问某个...

    易语言-[鱼刺多线程-鱼刺类_多线程应用模块v5.4完整

    鱼刺类_多线程应用 - 更新日志 5.4.3(2017-12-01) *修正 修正鱼刺类_线程池Ex/线程池Ex一处很难被触发的BUG *修改 去除所有用到取启动时间的函数/方法 (修正在系统开机超过29天的机器上可能会出现问题) *修正 类回调...

    DELPHI加减法运算小实验

    DELPHI,作为一款强大的面向对象的编程语言和集成开发环境,因其高效的代码生成和直观的可视...随着你对Delphi的深入学习,你可以尝试更复杂的操作,比如处理浮点数、错误处理、多线程计算等,进一步提升你的编程技能。

    使用事件来同步线程

    在多线程编程中,同步是至关重要的,它确保了多个线程对共享资源的访问是有序和安全的。在Python中,`threading.Event`是一个实用的工具,用于线程间的通信和同步。本篇文章将深入探讨如何利用`Event`对象来控制线程...

    tcl实例入门教程(包括常用的socket多线程xml解析数据库操作大量实例)

    - **多线程支持**: TCL支持多线程编程。 - **线程创建**: 使用 `thread::create` 命令来创建新的线程。 - **线程同步**: 提供了锁机制来同步线程之间的操作。 #### 例子: ```tcl package require thread thread::...

    鱼刺类_多线程应用5.4含源码-易语言

    鱼刺类_多线程应用 - 更新日志 5.4.3(2017-12-01) *修正 修正鱼刺类_线程池Ex/线程池Ex一处很难被触发的BUG *修改 去除所有用到取启动时间的函数/方法 (修正在系统开机超过29天的机器上可能会出现问题) *修正 类回调...

    N:适用于Windows的实验性多线程bignum库

    3. **多线程编程**:在Windows平台上,这通常涉及到`CreateThread`、`WaitForMultipleObjects`等API的使用,以创建和管理线程。同时,要确保线程安全,避免竞态条件和死锁,可能需要使用互斥量(mutex)、信号量...

    《Java编程语言:原理与范例》课后实验源代码.doc

    在该程序中,我们可以看到Java多线程编程的基本概念,包括线程的创建、线程的启动、线程的睡眠等。该程序也展示了Java中如何使用SimpleDateFormat类来格式化日期和时间的输出。 图形用户界面编程 在第一章实验二中...

    VS2005 c#中创建DLL与使用DLL源码

    在.NET框架中,C#是一种常用的编程语言,用于构建各种应用程序。Visual Studio 2005(VS2005)是开发这些应用的集成开发...通过实践,你可以进一步探索DLL的高级特性,如延迟加载、版本控制以及多线程环境下的使用等。

    robotium测试之创建android实例

    通过这种方式,我们可以为Calculator应用创建多个测试用例,覆盖其各种功能,确保它们在不同的场景下都能正常工作。同时,Robotium还支持多线程测试、等待条件以及日志记录等功能,使得测试更加灵活和全面。 在实际...

    rwady__constant.zip_rwady_进程与线程

    5. **多线程编程**:虽然标题提及进程与线程,但在描述中并未直接涉及,但如果是计算密集型任务,多线程并行计算可能是提高效率的一种方式,所以理解C++中的线程概念和`&lt;thread&gt;`库的使用也是重要知识点。...

    计算机原理实验

    例如,他们可能需要创建一个程序,模拟键盘输入和屏幕输出,以此来学习数据传输的过程。 再者,实验4可能涵盖了处理器架构和指令集。学生可能需要设计并实现一个简单的处理器模型,通过编程模拟其工作,这通常涉及...

    eigen库.zip

    7. **线程安全**:Eigen库是线程不安全的,但提供了`Eigen::DenseBase::eval()`函数来确保在多线程环境中正确同步计算。此外,用户也可以自定义内存池来进一步优化多线程性能。 8. **跨平台**:Eigen库是跨平台的,...

    C++ 11 开发中的 Atomic 原子操作.rar_C++11、原子_atomic c++_c++ atomic使用_c++

    对于整型的原子变量,`std::atomic`还提供了`fetch_add()`、`fetch_sub()`、`++`和`--`等操作,它们在多线程环境下安全地实现了加法和减法。 5. **原子指针操作(Atomic Pointer Operations)** `std::atomic`...

    divide_valarray_value.rar_The Divide

    - **多线程编程**:`timm_osal_mutex`表明程序可能涉及多线程环境,需要同步机制来保护共享资源的安全。 - **互斥锁(Mutex)**:作为一种同步原语,用于控制对共享资源的访问,防止多个线程同时修改同一数据,保证...

Global site tag (gtag.js) - Google Analytics