#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *clean(void *arg)
{
printf("cleanup :%s \n",(char *)arg);
return (void *)0;
}
void *thr_fn1(void *arg)
{
printf("thread 1 start \n");
pthread_cleanup_push( (void*)clean,"thread 1 first handler");
pthread_cleanup_push( (void*)clean,"thread 1 second hadler");
printf("thread 1 push complete \n");
if(arg)
{
return((void *)1);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
return (void *)1;
}
void *thr_fn2(void *arg)
{
printf("thread 2 start \n");
pthread_cleanup_push( (void*)clean,"thread 2 first handler");
pthread_cleanup_push( (void*)clean,"thread 2 second handler");
printf("thread 2 push complete \n");
if(arg)
{
pthread_exit((void *)2);
}
pthread_cleanup_pop(0);
pthread_cleanup_pop(0);
pthread_exit((void *)2);
}
int main(void)
{
int err;
pthread_t tid1,tid2;
void *tret;
err=pthread_create(&tid1,NULL,thr_fn1,(void *)1);
if(err!=0)
{
printf("error .... \n");
return -1;
}
err=pthread_create(&tid2,NULL,thr_fn2,(void *)1);
if(err!=0)
{
printf("error .... \n");
return -1;
}
err=pthread_join(tid1,&tret);
if(err!=0)
{
printf("error .... \n");
return -1;
}
printf("thread 1 exit code %d \n",(int)tret);
err=pthread_join(tid2,&tret);
if(err!=0)
{
printf("error .... ");
return -1;
}
printf("thread 2 exit code %d \n",(int)tret);
return 1;
}
分享到:
相关推荐
《多线程垃圾文件清除器详解》 在计算机系统中,垃圾文件的积累不仅占用宝贵的存储空间,还可能影响系统的运行效率。为了有效地管理和清理这些无用文件,开发者设计了一种名为“多线程垃圾文件清除器”的工具。本文...
线程清除,或线程终止,是指结束线程的执行并释放其占用的资源。当线程完成其任务或者被显式地请求退出时,可以调用`pthread_exit()`(如`thread_exit_struct.c`所示),它允许线程返回一个退出状态值。 三、线程ID...
因此,使用`ThreadLocal`时,务必在不再需要变量时及时清除。 总的来说,“多线程线程变量赋值”是一个关于如何在多线程环境中管理线程私有数据的问题。通过`ThreadLocal`,我们可以创建和操作线程特有的变量,避免...
"VB消除线程,可防止多次运行"这个标题涉及到的核心概念是线程控制,它关系到程序的并发执行和资源管理。线程是程序中的一个执行流,允许程序同时执行多个不同的任务。当程序设计不当,可能会导致多个线程同时运行同...
Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程...interrupted 方法可以判断是否被中断,静态方法 interrupted() 则可以判断是否被中断,并清除当前中断状态。需要根据中断标志位手动处理线程中断。
在 Linux2.4 内核中,消除了这个线程个数的限制,并且允许在系统运行中动态地调整进程数上限。当时采用的是 LinuxThread 线程库,它对应的线程模型是“一对一”线程模型,也就是一个用户级线程对应一个内核线程,而...
- 预防死锁:消除死锁的四个必要条件之一,例如通过超时机制、资源预分配等。 - 避免死锁:动态地分配资源,避免出现循环等待条件。 - 检测和恢复死锁:定期检查系统状态,检测到死锁后,可以终止某个线程或者回滚...
- 继续:用户选择继续时,清除暂停标志,线程们继续发送请求下载剩余部分。UI线程恢复进度条更新。 在Delphi XE7中,你可以使用`TThread`类创建自定义线程,实现上述逻辑。每个线程负责下载文件的一部分,并在完成...
- 清除不再需要的线程属性对象。 **设置分离状态** - 配置线程是否自动分离。 **获取分离状态** - 查询线程的分离状态。 **设置栈溢出保护区大小** - 设定线程栈溢出时的安全区大小。 **获取栈溢出保护区大小...
在C++编程中,线程是并发执行的基本单元,它允许程序同时执行多个任务。本文将深入探讨如何在...这对于开发跨平台的C++应用程序是非常有价值的,因为它消除了对特定平台API的依赖,提高了代码的可移植性和可维护性。
其中,lpEventAttributes 是安全属性结构指针,bManualReset 是手动清除信号标记,bInitialState 是初始状态,lpName 是事件对象的名称。 CreateMutex 函数用来创建一个互斥量对象,用于保护共享资源。该函数的原型...
清除() // 清除事件,让线程可以继续执行 ``` 在上述代码中,`.线程对象`是创建的线程实例,`.事件对象`是Event事件对象。`线程执行代码`是线程运行时执行的代码段,其中应包含对`.事件对象`的等待操作,如`.事件...
5. 清空/重置:清除缓冲区中的所有数据,以便重新使用。 在多线程环境中,内存池和BUFFER类的结合可以显著提升性能。例如,每个线程可以拥有自己的内存池来分配缓冲区,这样减少了线程间共享资源的冲突。同时,使用...
### 多线程知识总结 #### 一、线程基础概念 **线程状态:** 在探讨多线程之前,我们需要了解线程的基本状态转换。一个典型的线程生命周期包括以下几个阶段: 1. **Start(启动):** 当线程被创建后调用`start()`...
在没有直接的恢复API的情况下,线程的恢复通常通过清除暂停标志或触发等待的事件来实现。在多线程环境中,确保恢复操作的原子性和避免竞态条件是至关重要的。 4. **线程的终止** 终止线程是一种强制结束其执行的...
1. **事件对象(Event)**:通过设置和清除事件状态,线程可以通知其他线程开始或结束某个任务。在VC++中,CreateEvent和SetEvent函数可以创建和控制事件对象。 2. **信号量(Semaphore)**:信号量用于限制同时访问...
而在多线程俄罗斯方块中,游戏逻辑(如方块的下落、旋转、消除行)和用户交互(如键盘输入)被分隔在不同的线程中。这样做可以确保即使在进行密集计算时,用户仍然能流畅地控制游戏,极大地提升了游戏体验。 接下来...
`interrupted()`方法会清除中断状态,而`isInterrupted()`则不会。 - 当线程处于阻塞状态(如`sleep()`、`wait()`或`join()`)时,如果线程被中断,将会抛出`InterruptedException`异常。 #### 4. 线程控制方法 - `...
在IT安全领域,多线程扫描网页木马是一项重要的技术,用于快速有效地检测和清除潜在的恶意代码。这里,我们将深入探讨多线程的概念、它如何应用于木马扫描,以及如何通过遍历文件来判断是否为网页木马。 首先,多...