`
eriol
  • 浏览: 405525 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

修改线程的属性

阅读更多

 

在使用pthread_create函数创建了一个线程,可以使用了线程属性的默认参数,即将该函数的第二个参数设为NULL。对大多数程序来说,使用默认属性就够了,但还是有必要来了解一下线程的有关属性。

 

  属性结构为pthread_attr_t,它同样在头文件/usr/include/pthread.h中定义。

 

      属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。属性对象主要包括是否绑定、是否分离、堆栈地址、堆栈大小、优先级。默认的属性为非绑定、非分离、缺省1M的堆栈、与父进程同样级别的优先级。

 

  关于线程的绑定,牵涉到另外一个概念:轻进程(LWP:Light Weight Process)。轻进程可以理解为内核线程,它位于用户层和系统层之间。系统对线程资源的分配、对线程的控制是通过轻进程来实现的,一个轻进程可以控制一个或多个线程。默认状况下,启动多少轻进程、哪些轻进程来控制哪些线程是由系统来控制的,这种状况即称为非绑定的。绑定状况下,则顾名思义,即某个线程固定的"绑"在一个轻进程之上。被绑定的线程具有较高的响应速度,这是因为CPU时间片的调度是面向轻进程的,绑定的线程可以保证在需要的时候它总有一个轻进程可用。通过设置被绑定的轻进程的优先级和调度级可以使得绑定的线程满足诸如实时反应之类的要求。

 

  设置线程绑定状态的函数为 pthread_attr_setscope,它有两个参数,第一个是指向属性结构的指针,第二个是绑定类型,它有两个取值: PTHREAD_SCOPE_SYSTEM(绑定的)和PTHREAD_SCOPE_PROCESS(非绑定的)。下面的代码即创建了一个绑定的线程。

 

 

#include <pthread.h>
pthread_attr_t attr;
pthread_t tid;

/*初始化属性值,均设为默认值*/
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);

pthread_create(&tid, &attr, (void *) my_function, NULL);
 

  线程的分离状态决定一个线程以什么样的方式来终止自己。如果采用线程的默认属性,即为非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join() 函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。程序员应该根据自己的需要,选择适当的分离状态。

 

      设置线程分离状态的函数为 pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。这里要注意的一点是,如果设置一个线程为分离线程,而这个线程运行又非常快,它很可能在 pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方法之一是可以在被创建的线程里调用 pthread_cond_timewait函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程里常用的方法。但是注意不要使用诸如wait() 之类的函数,它们是使整个进程睡眠,并不能解决线程同步的问题。

 

  另外一个可能常用的属性是线程的优先级,它存放在结构sched_param中。用函数pthread_attr_getschedparam和函数 pthread_attr_setschedparam进行存放,一般说来,我们总是先取优先级,对取得的值修改后再存放回去。

 

 

#include <pthread.h>
#include <sched.h>
pthread_attr_t attr;
pthread_t tid;
sched_param param;
int newprio=20;

pthread_attr_init(&attr);
pthread_attr_getschedparam(&attr, &param);
param.sched_priority=newprio;
pthread_attr_setschedparam(&attr, &param);
pthread_create(&tid, &attr, (void *)myfunction, myarg);
 

原文地址:http://blog.csdn.net/celineshi/archive/2007/06/28/1670216.aspx

分享到:
评论

相关推荐

    Linux多线程学习

    `pthread_attr_init()`和`pthread_attr_set*()`系列函数用于初始化和修改线程属性,如栈大小、调度策略和优先级等。这些属性可以影响线程的运行行为,例如,设置栈大小可以防止栈溢出,而调度策略和优先级则可以调整...

    linux多线程编程[收集].pdf

    线程的调度策略可以通过修改线程属性进行调整。 总的来说,Linux多线程编程提供了强大的并发能力,但同时也带来了额外的复杂性。理解和掌握线程的创建、管理、同步和通信机制,对于编写高效、可靠的多线程应用至关...

    linux多线程编程

    2.2 修改线程属性: 线程属性包括绑定属性(确定线程与内核级线程的对应关系)、分离属性(线程结束时是否立即释放资源)以及优先级等。使用`pthread_attr_init`初始化属性,然后通过`pthread_attr_setscope`、`...

    多线程编程指南--c版

    在Linux下,可以通过修改线程属性来影响其调度优先级。 6. **线程安全**:线程安全是指函数在多线程环境中被调用时,不会产生错误或不确定的行为。线程不安全的函数可能引发数据竞争或死锁,因此编写多线程程序时,...

    易语言修改线程默认堆栈大小源码

    本文将深入探讨易语言中如何修改线程的默认堆栈大小,并提供相关源码分析。 首先,理解线程堆栈是非常基础且关键的知识点。线程堆栈是每个线程独享的内存区域,用于存储局部变量、函数调用参数、返回地址等信息。...

    实验七:Linux多线程编程(实验报告).docx

    修改线程属性 在创建线程之前,可以通过设置`pthread_attr_t`结构体来调整线程的属性。例如: - **pthread_attr_init**:初始化一个线程属性对象。 ```c extern int pthread_attr_init(pthread_attr_t *attr); ...

    线程属性(linux内核)1

    本章主要讨论的是如何通过线程属性对象来定制线程的创建和行为,特别是针对Linux环境。 线程属性对象是一个重要的概念,它允许开发者指定不同于默认行为的线程属性。这些属性可以在创建线程时通过`pthread_create...

    pthread(arm_linux).zip_ARM Linux_arm_arm linux pthread_arm pthre

    `pthread_attr_init()`和`pthread_attr_setstacksize()`等函数用于初始化和修改线程属性。 四、线程安全函数 在多线程环境中,非线程安全函数可能会引发数据竞争问题。pthread库提供了线程安全的函数,如线程安全的...

    LinuxPthread实例详解及学习文档

    例如,你可以找到如何使用互斥量保护共享资源、如何利用条件变量实现线程间的协调、如何设置和修改线程属性等示例代码。 在学习过程中,了解和分析提供的线程学习实例是非常有益的。它们可能包括简单的线程创建、...

    Pthread-Primer.rar_pthread_unix primer

    `pthread_attr_init()`和`pthread_attr_set*()`函数可以用来初始化和修改线程属性。 七、线程局部存储(TLS) 线程局部存储是一种为每个线程分配独立变量的方法,使用`pthread_key_create()`和`pthread_getspecific...

    POSIX Pthread 编程资料大全

    可以使用`pthread_attr_init()`和`pthread_attr_set*()`系列函数初始化和修改线程属性。 六、线程安全函数 线程安全函数是指在多线程环境下能够正确工作的函数,它们不会受到并发执行的影响。比如,线程安全的动态...

    c#多线程中子线程动态改变ui控件

    在上面的代码中,我们首先获取UI线程的同步上下文,然后在子线程中使用Post方法异步更新Label控件的Text属性。 C#子线程更新UI控件有两种常用的方法:使用控件自身的Invoke/BeginInvoke方法和使用...

    VB进程隐藏

    这可以通过修改线程属性或使用API如`SetThreadPriority`来实现。 6. **注入代码**:将隐藏代码注入到其他进程中,使得主进程自身不执行任何隐藏操作,提高隐蔽性。 7. **权限检查**:确保代码在非管理员权限下也能...

    C#多线程之Thread中Thread.IsAlive属性用法分析

    线程状态的检查和修改应配合其他同步机制,如`Mutex`, `Semaphore`, `Monitor`或`lock`关键字,以防止数据竞争和死锁的发生。 总结来说,`Thread.IsAlive`是C#中用来检测线程状态的一个实用工具,它帮助开发者了解...

    WPF高频率修改控件属性 防止界面假死

    在UI线程频繁修改控件属性时 不能实时显示属性的修改 调用此方法可以即时显示 防止界面假死

    Delphi7创建及释放线程实例

    2. **设置线程属性:** - `Suspended`属性控制线程是否在创建后立即启动。如果设为True,线程将被暂停,直到调用`Resume`方法。 - `FreeOnTerminate`属性决定线程结束后是否自动释放。如果设为True,线程对象将在...

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    例如,在一个Windows Forms应用程序中,如果有两个或多个线程操作同一个TextBox控件,那么该控件可能会出现不一致的状态,例如文本框中的文本可能会被不同的线程修改,从而导致控件的状态不一致。 为了避免这种情况...

    由浅入深Linux下pthread线程库介绍[归类].pdf

    本文将详细介绍Linux下pthread线程库的基本概念、线程创建、线程结束、线程属性修改等方面的知识点。 线程的优点 多线程程序作为一种多任务、并发的工作方式,有以下的优点: 1. 提高应用程序响应:使用多线程...

    医疗DCM文件实现属性修改后保存新文件

    本文将详细探讨如何通过编程实现DCM文件的属性修改,并保存为新文件,以便进行三维重建等高级应用。我们将使用Visual Studio 2019和WinForm作为开发环境,同时涉及fo-DICOM库这一强大的 DICOM 工具。 1. **DCM文件...

Global site tag (gtag.js) - Google Analytics