对上一次写得再修改,修正了部分问题,但是无法处理过大线程数,可能是系统资源分配问题
代码如下:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
int sum;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
void * thread(void *);
int main(int argc, char *argv[])
{
pthread_t tid[SIZE];
int i, rc[SIZE] = {0, 0, 0, 0, 0};
printf("enter main\n");
printf("Please input a number : \n");
scanf("%d", &sum);
while (sum >= 0)
{
for (i = 1; i < SIZE; i++)
{
int * argzone = malloc((int)sizeof(int));
*argzone = i;
rc[i] = pthread_create(&tid[i], NULL, thread, argzone);
if (rc[i] != 0)
printf("The thread%d-create is failed!\n", i);
}
// pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
// pthread_mutex_unlock(&mutex);
}
printf("leave main\n");
exit(0);
}
void * thread(void *arg)
{
int * nArg = (int *)arg;
printf("enter thread%d\n", *nArg);
pthread_mutex_lock(&mutex);
if (sum <= 0)
exit(0);
else
printf("This is thread%d, sum : %d, thread id is %u\n", *nArg, sum, (unsigned int)pthread_self());
pthread_cond_signal(&cond);
sum -= (*nArg);
printf("This is thread%d, sum : %d, thread id is %u\n", *nArg, sum, (unsigned int)pthread_self());
pthread_mutex_unlock(&mutex);
printf("leave thread%d\n", *nArg);
pthread_exit(0);
}
- 大小: 107.2 KB
分享到:
相关推荐
- **信号量(SEMAPHORE)**:一种同步机制,用于控制多线程或多进程对共享资源的访问。 ##### 声明 - **常量声明(CONSTANT declarations)**:定义不可更改的值。 - **类型声明(TYPE declarations)**:定义新的...
`final`关键字确保了代码的稳定性和安全性,特别是在多线程环境中,它可以帮助避免并发问题。 #### 六、堆与栈的区别 堆和栈是Java内存管理中的两个关键概念。栈内存主要用于存储局部变量和方法调用信息,特点是...
例如,我们可以创建一个DoAddition()函数来处理加法,DoSubtraction()处理减法,以此类推。对于三角函数、对数、指数等,我们可以使用C++标准库中的cmath头文件,它提供了sin、cos、exp、log等函数。 对于复杂操作...
6. **优化**:为了提高性能,矩阵库可能包含一些优化策略,例如利用SIMD(单指令多数据)指令进行向量化处理,或者通过多线程并行计算。 7. **错误检查**:在执行矩阵运算时,库通常会检查非法操作,例如试图对非...
在已有线程中插入函数节点,如减法节点,只需在连线附近右击,选择相应函数即可。对于双输入节点,通过按住Ctrl键并单击,可以快速调整输入端接线,简化了复杂电路的调试过程。此技巧仅适用于双输入端节点,特定场景...
- 如何使用Task并行库(TPL)来简化多线程编程。 - 并发集合和异步编程模式的使用技巧。 ### 13. 寻找C#的标准形式 (In Search of C# Canonical Forms) - **介绍**:这一章节讨论了C#编程中的最佳实践。 - **重点...
1. 线程优先级:线程的优先级是调度的一个概念,数值越高代表优先级越高,10通常代表最高优先级,1代表最低。 2. ASCII码:计算机中基本的字符编码是ASCII码,但并非所有信息都以ASCII码存储,现代系统多使用...
这些知识点涵盖了异常处理、类与对象的创建、垃圾回收、线程同步、错误与异常的区别、关键字`final`的作用、堆栈的区别、大整数实现、图形系统的实现、静态嵌套类与非静态嵌套类的区别等多个方面,对于理解和掌握...
线程同步是多线程编程中的一项重要技能,用于解决线程间的竞争条件。 **详细解释:** 1. **wait():** - 使线程进入等待状态,并释放锁。 - 必须在同步方法或同步块内使用。 2. **sleep():** - 让线程暂停一段...
- **多线程支持**: 可以通过配置选项启用或禁用多线程支持。 - **优化级别**: 编译时可以选择不同的优化等级来提高性能。 - **ABI和ISA**: - **ABI (Application Binary Interface)**: 支持多种ABI,包括但不仅...
5. **并发处理**:处理并发数据访问时,可以使用锁(如 Monitor、Mutex、Semaphore),线程同步原语(如 WaitHandle、EventWaitHandle),或者使用线程安全的数据结构(如 ConcurrentDictionary)。在.NET中,还可以...
- 当对象不再使用时,将其赋值为`null`,特别是线程等占用资源较多的对象,有助于垃圾回收机制更早地释放内存。 11. **内置方法优先**: - 利用Java提供的内置方法,如`System.arraycopy()`,它们通常是高度优化...
- **扩展函数**:通过扩展函数,可以为现有类添加新的行为,无需继承或修改原有类。 #### 从API中获取数据 - **执行一个请求**:使用OkHttp等网络库发起HTTP请求。 - **在主线程以外执行请求**:了解如何异步处理...
这使得用户能够轻松管理大量的输入数据,并能够在不修改模型的情况下更改数据。 - **定义数据**:直接在数据段中定义变量的值。 - **链接外部数据源**:可以通过导入外部数据文件(如 Excel 文件)来填充数据段。 ...
这种模型有助于解决多线程应用程序中的同步问题。 #### 应用程序框架 (Application Framework) 应用程序框架是指一套预先定义好的类和接口,用于构建特定类型的应用程序。框架通常提供了一组标准的解决方案和模式...
- GMP 设计为可重入的,这意味着可以在多个线程中安全地使用同一份库。 - 但开发者需要注意避免共享状态导致的问题。 ##### 3.8 有用的宏和常量 - GMP 提供了一系列宏和常量来方便编程。 - 如 `GMP_MAX_LIMBS` 定义...
- **别名问题**:在多线程或多任务环境中,如果多个指针指向同一个内存位置,那么其中一个指针修改了该位置的数据,可能会影响其他指针的值,这种情况称为别名问题。 #### 十、内存的层次结构 现代计算机系统中的...
- **多线程概念:** 多线程是Java语言中实现并发的基础机制之一。通过创建多个线程,可以让程序中的多个任务同时执行,提高程序的执行效率。 - **线程生命周期:** Java中的线程有几种状态:新建(New)、就绪...
- **算术运算**: 包括加法`+`, 减法`-`, 乘法`*`, 除法`/`, 模运算`%`。 - **比较运算**: 包括`==`, `!=`, `, `>`, `, `>=`。 - **逻辑运算**: 包括`&&`(逻辑与)、`||`(逻辑或)、`!`(逻辑非)。 ##### 指针 - ...
### 2. 数据类型与表达式 在选项中提到的日期类型的表达式中,正确答案是**B. date()-{^1985-10-1}**。这里涉及到的是日期类型数据的表示和运算。选项B实际上执行的是日期减法运算,得到的结果是一个时间间隔,而非...