int pthread_create(pthread_t *thread,pthread_attr_t *attr, *(*start_routine)(void *),void *arg) ;
/*第一个参数是指向Pthread_t类型数据的指针,线程被创建时,这个指针指向的变量中将被写入一个标识符,我们将用该标识符来引用新线程。下一个参数用于设置线程的属性,一般置为NULL。最后两个参数分别告诉线程将要启动执行的函数以及传给该函数的参数。*/
void pthread_exit(void *retval);
/*终止调用它的线程并返回一个指向某个对象的指针。注意:绝对不能用它来返回一个指向局部变量的指针,因为线程调用该函数之后,这个局部变量就不复存在了,这将引起严重的程序漏洞/ int pthread_jion(pthread_t th,void **thread_return); /作用等价于进程中用来收集子进程信息的wait函数。第一个参数指定了要等待的进程,线程通过pthread_create返回的标识符来指定。第二个参数是一个指针,它指向另一个指针,而后者指向线程的返回值。这个函数将等到它指定的线程终止后才返回。/ /*线程程序在编译时一定要定义宏_REENTRANT可能还需要_POSIX_C_SOURCE 例:
gcc -D_REENTRANT thread1.c -o thread1 -lpthread */
同步属性:
信号量: 1.二进制信号量:保护某一段代码,使得每次只被一个执行线程运行。
2.计数信号量:允许有限数目的线程执行一段指定的代码 信号量函数的名字都以sem 开头,线程中使用的基本信号量函数有4个。 #include<semaphore.h>
int sem_init(sem_t *sem,int pshared,unsigned int value);
/*初始化由sem指向的信号量对象,设置它的共享选项,并给他一个初始的整数值。pshared 参数控制信号量的类型,0:表示这个信号量是当前进程的局部信号量,否则这个信号量就可以在多个进程之间共享。*/
int sem_wait(sem_t *sem); int sem_post(sem_t *sem);
/*两个信号量控制函数,控制信号量的值。都以一个指针为参数,该指针指向的对象是由sem_init 调用初始化的信号量。 sem_post 以原子操作的方式给信号量的值+1 sem_wait 以原子操作的方式将信号量的值-1,但它会等到直到信号量有个非0 值才会开始减法操作。 原子操作:如果两个线程企图同时给一个信号量+1,他们之间不会互相干扰,而不像如果两个程序同时对同一个文件进行读取等操作时可能会引起冲突。*/
int sem_destroy(sem_t *sem);
/*清理信号量所拥有的全部资源,如果企图清理的信号量正在被一些线程等待,就会收到一个错误*/
/*在多线程程序中,我们需要对时序考虑的非常仔细。*/
互斥量: /*允许程序员锁住某个对象,使得每次只有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁它。*/
include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);
/*第二个参数允许我们设置互斥量的属性,而属性控制着互斥量的行为。属性类型默认为fast。*/
nt pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_destory(pthread_mutex_t *mutex);
/*与其他函数类似,成功时返回0,失败时将返回错误代码,但这些函数并不设置errno,你必须对函数的返回代码进行检查。*/
其他高级特性: eg:脱离线程:设置脱离状态属性可以允许第二个线程独立地完成工作,而无需原先的线程在原地等待。
int pthread_attr_init(pthread_attr_t *attr);
/*初始化一个线程属性对象*/
int pthread_attr_destroy(pthread_attr_t *attr);
/*对属性对象进行清理和回收。一旦对象被回收了,除非他被重新初始化,否则不能被再次使用。*/
/*初始化一个线程属性对象后,我们可以调用许多其他的函数来设置不同的属性行为。*/
eg:调度:设置调度属性和设置脱离状态非常相似,可以用sched_get_priority_max 和 sched_get_priority_min 这两个函数来查找可用的优先级级别。
eg:取消一个线程:
int pthread_cancel(pthread_t thread);
/*用于请求一个线程终止的函数*/
int pthread_setcancelstate(int state,int *oldstate);
/*用于线程设置自己的取消状态*/
/*第一个参数的取值可以是PTHREAD_CANCEL_ENABLE,这个值允许线程接收取消请求;或者是PTHREAD_CANCEL_DISABLE,它的作用是忽略取消请求。oldstate指针用于获取先前的取消状态。如果没需要,只需传递NULL即可。*/
int pthread_setcanceltype(int type,int *oldtype);
/*如果取消请求被接受了,线程就可以进入第二个控制层次,同上述函数设置取消类型*/
int pthread_create(pthread_t *thread,pthread_attr_t *attr, *(*start_routine)(void *),void *arg) /第一个参数是指向Pthread_t类型数据的指针,线程被创建时,这个指针指向的变量中将被写入一个标识符,我们将用该标识符来引用新线程。下一个参数用于设置线程的属性,一般置为NULL。最后两个参数分别告诉线程将要启动执行的函数以及传给该函数的参数。/ void pthread_exit(void *retval) /终止调用它的线程并返回一个指向某个对象的指针。注意:绝对不能用它来返回一个指向局部变量的指针,因为线程调用该函数之后,这个局部变量就不复存在了,这将引起严重的程序漏洞/ int pthread_jion(pthread_t th,void **thread_return); /作用等价于进程中用来收集子进程信息的wait函数。第一个参数指定了要等待的进程,线程通过pthread_create返回的标识符来指定。第二个参数是一个指针,它指向另一个指针,而后者指向线程的返回值。这个函数将等到它指定的线程终止后才返回。/ /*线程程序在编译时一定要定义宏_REENTRANT可能还需要_POSIX_C_SOURCE 例: gcc -D_REENTRANT thread1.c -o thread1 -lpthread */
同步属性: 信号量: 1.二进制信号量:保护某一段代码,使得每次只被一个执行线程运行。 2.计数信号量:允许有限数目的线程执行一段指定的代码 信号量函数的名字都以sem 开头,线程中使用的基本信号量函数有4个。 #include<semaphore.h> int sem_init(sem_t *sem,int pshared,unsigned int value); /初始化由sem指向的信号量对象,设置它的共享选项,并给他一个初始的整数值。pshared 参数控制信号量的类型,0:表示这个信号量是当前进程的局部信号量,否则这个信号量就可以在多个进程之间共享。/ int sem_wait(sem_t *sem); int sem_post(sem_t *sem); /两个信号量控制函数,控制信号量的值。都以一个指针为参数,该指针指向的对象是由sem_init 调用初始化的信号量。 sem_post 以原子操作的方式给信号量的值+1 sem_wait 以原子操作的方式将信号量的值-1,但它会等到直到信号量有个非0 值才会开始减法操作。 原子操作:如果两个线程企图同时给一个信号量+1,他们之间不会互相干扰,而不像如果两个程序同时对同一个文件进行读取等操作时可能会引起冲突。/ int sem_destroy(sem_t *sem); /清理信号量所拥有的全部资源,如果企图清理的信号量正在被一些线程等待,就会收到一个错误/ /在多线程程序中,我们需要对时序考虑的非常仔细。/
互斥量: /允许程序员锁住某个对象,使得每次只有一个线程访问它。为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,然后在完成操作之后解锁它。/ include<pthread.h> int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr); /第二个参数允许我们设置互斥量的属性,而属性控制着互斥量的行为。属性类型默认为fast。/ int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_destory(pthread_mutex_t *mutex); /与其他函数类似,成功时返回0,失败时将返回错误代码,但这些函数并不设置errno,你必须对函数的返回代码进行检查。/
其他高级特性: eg:脱离线程:设置脱离状态属性可以允许第二个线程独立地完成工作,而无需原先的线程在原地等待。 int pthread_attr_init(pthread_attr_t *attr); /初始化一个线程属性对象/ int pthread_attr_destroy(pthread_attr_t *attr); /对属性对象进行清理和回收。一旦对象被回收了,除非他被重新初始化,否则不能被再次使用。/ /初始化一个线程属性对象后,我们可以调用许多其他的函数来设置不同的属性行为。/
eg:调度:设置调度属性和设置脱离状态非常相似,可以用sched_get_priority_max 和 sched_get_priority_min 这两个函数来查找可用的优先级级别。
eg:取消一个线程: int pthread_cancel(pthread_t thread); /用于请求一个线程终止的函数/ int pthread_setcancelstate(int state,int *oldstate); /用于线程设置自己的取消状态/ /第一个参数的取值可以是PTHREAD_CANCEL_ENABLE,这个值允许线程接收取消请求;或者是PTHREAD_CANCEL_DISABLE,它的作用是忽略取消请求。oldstate指针用于获取先前的取消状态。如果没需要,只需传递NULL即可。/ int pthread_setcanceltype(int type,int *oldtype); /如果取消请求被接受了,线程就可以进入第二个控制层次,同上述函数设置取消类型/