换一种说法来描述这段话,不改变正确性和语义:1.创建线程,用pthread_attr_getscope()方法来确认是系统竞争范围还是线程竞争范围,再用pthread_attr_setscope()方法设置为系统竞争范围。 2.Ubuntu系统提供的是系统竞争范围线程调度。 3…Local Scheduling: 线程库调度用户级线程到一个有效的LWP【也就是用户线程映射内核线程】 – 被称为进程竞争范围VIM – 根据优先级完成,一般是由程序员给定 – 竞争发生在相同进程的线程之间 4…Global Scheduling: 系统将内核线程调度到有效的物理处理器上,被称为系统竞争范围 – 竞争发生在系统的所有线程之间(Window XP) 5. 系统为用户创建的调度算法为SCHED_OTHER
时间: 2023-06-27 10:04:46 浏览: 51
这段话介绍了如何创建一个线程,并将它设置为系统竞争范围。在Ubuntu系统中,提供了系统竞争范围的线程调度。线程库会将用户级线程调度到一个有效的LWP上,这被称为进程竞争范围VIM。这个竞争范围是由程序员给定的,并根据优先级进行调度。在全局竞争范围中,系统将内核线程调度到可用的物理处理器上,这被称为系统竞争范围。在Window XP系统中,线程之间的竞争发生在所有线程之间。最后,系统为用户创建的调度算法为SCHED_OTHER。
相关问题
pthread_attr_init pthread_create pthread_attr_setscope
这三个函数都是 POSIX 线程库中的函数,用于创建和管理线程。
1. `pthread_attr_init()` 函数用于初始化一个线程属性对象,该对象包含了线程的各种属性,如栈大小、调度策略等。函数原型如下:
```c
int pthread_attr_init(pthread_attr_t *attr);
```
2. `pthread_create()` 函数用于创建一个新的线程,并将其加入到进程中运行。函数原型如下:
```c
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
```
其中,`thread` 参数是指向新线程标识符的指针,`attr` 参数是指向线程属性对象的指针,`start_routine` 参数是一个函数指针,用于指定新线程的启动函数,`arg` 参数是传递给启动函数的参数。
3. `pthread_attr_setscope()` 函数用于设置线程的作用域,即线程能够访问的内存范围。函数原型如下:
```c
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
```
其中,`attr` 参数是指向线程属性对象的指针,`scope` 参数指定了线程的作用域,可以是 `PTHREAD_SCOPE_SYSTEM` 或 `PTHREAD_SCOPE_PROCESS`。`PTHREAD_SCOPE_SYSTEM` 表示线程是系统级别的,可以访问整个系统的内存空间;`PTHREAD_SCOPE_PROCESS` 表示线程是进程级别的,只能访问本进程的内存空间。
__GI___pthread_mutex_lock (mutex=0x38) at ../nptl/pthread_mutex_lock.c:67
__GI___pthread_mutex_lock是Linux系统中的一个函数,用于锁定互斥量。该函数的实现可以在../nptl/pthread_mutex_lock.c:67中找到。该函数的参数是一个指向pthread_mutex_t类型的指针mutex。下面是该函数的实现过程:
1.首先,该函数使用THREAD_GETMEM宏获取当前线程的ID。
2.然后,该函数使用__builtin_expect宏检查互斥量的类型是否正确。如果类型不正确,则调用__pthread_mutex_lock_full函数进行锁定。
3.如果类型正确,则使用CAS指令尝试获取互斥量的锁。如果CAS指令成功,则返回0,表示锁定成功。如果CAS指令失败,则调用__pthread_mutex_lock_full函数进行锁定。
下面是该函数的示例代码:
```c
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_func(void* arg) {
pthread_mutex_lock(&mutex);
// do something
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
pthread_t thread;
pthread_create(&thread, NULL, thread_func, NULL);
pthread_mutex_lock(&mutex);
// do something
pthread_mutex_unlock(&mutex);
pthread_join(thread, NULL);
return 0;
}
```