notice
欢迎注册after1000years.com投稿!(注册登录入口在页面右下角)
2008年9月27日  | 分类: 生活是一团麻  | 标签: ,

08年10月17日北美上映

2008年9月27日  | 分类: 生活是一团麻  | 标签: ,

imageimage

2008年9月26日  | 分类: 生活是一团麻  | 标签: ,

(本文为bin学习网文《linux下的多线程编程》(作者:姚继锋 2001-08-11 09:05:00 来自:http://www.china-pub.com)时写下的摘要和学习笔记,特此声明,after1000years.com)

pthread_attr_t是存放线程属性的数据结构(pthread_create()的第二个参数)不能直接修改,需要通过调用各种前缀为pthread_attr_的函数来修改。

1. pthread_attr_setscope(pthread_attr_t *attr, int scopestate)(线程绑定函数)

系统控制线程是通过轻进程来实现的,一个轻进程可以控制一个或多个线程。绑定的好处就是线程具有较高的响应度,在需要的时候总有一个轻进程可以为之所用。

实现:

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

/*初始化属性值,均设为默认值*/
pthread_attr_init(&attr);
pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);//第二个参数还有一个选项是PTHREAD_SCOPE_PROCESS(非绑定的)

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

2. pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)(线程分离函数)

如上篇文章所示的例子,pthread_join可以等到线程返回,这个线程与父线程未分离,如果设置了分离,则pthread_join无法等到这个线程了,父线程执行完毕之后直接就释放资源,结束了。(暂时想不出哪里用的上,因为完全可以设置为不分离,然后也不用join,直接让父线程跑掉就可以实现相同效果。)

例子:

#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>
using namespace std;

void thread(void) {
struct timeval now;
struct timezone tz;
struct timespec timeout;

/*
timeout.tv_sec = time(0)+ 10;
timeout.tv_nsec = 0;
*/
gettimeofday(&now, &tz);
timeout.tv_sec = now.tv_sec + 5;
timeout.tv_nsec = now.tv_usec * 1000;

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_timedwait(&cond, &mut, &timeout);
pthread_mutex_unlock(&mut);
for(int i = 0; i < 3; i++) {
printf(”this is a pthread!\n”);
}
// pthread_exit(NULL);
}

int main() {
pthread_t id;
pthread_attr_t attr;

pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
int ret = pthread_create(&id, &attr, (void* (*)(void*))thread, NULL);
if(ret != 0) {
printf(”create pthread error!\n”);
exit(1);
}

for(int i = 0; i < 3; i++) {
printf(”this is main thread!\n”);
}
printf(”test1\n”);

// pthread_join(id, NULL);

printf(”test2\n”);

return EXIT_SUCCESS;
}

贴上网友一个很有意思的例子:原文地址

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

void* task1(void*);
void* task2(void*);

int main()
{
pthread_t pid1, pid2;
pthread_attr_t attr;
int ret;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
pthread_create(&pid1, &attr, task1, NULL);
ret=pthread_join(pid1, NULL);
printf(”ret=%d\n”, ret);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_create(&pid2, &attr, task2, NULL);
ret=pthread_join(pid2, NULL);
printf(”ret=%d\n”, ret);
return 1;
}

void* task1(void*)
{
printf(”task1\n”);
pthread_exit(NULL);
}

void* task2(void*)
{
pthread_detach(pthread_self());
printf(”task2\n”);
pthread_exit(NULL);
}

3. 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, NULL);

2008年9月26日  | 分类: 生活是一团麻  | 标签: ,

1. extern int pthread_create (pthread_t *__restrict __newthread,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg) __THROW __nonnull ((1, 3));

/* Create a new thread, starting with execution of START-ROUTINE getting passed ARG. Creation attributed come from ATTR. The new handle is stored in *NEWTHREAD. */

2. extern void pthread_exit (void *__retval) __attribute__ ((__noreturn__));

/* Terminate calling thread. The registered cleanup handlers are called via exception handling so we cannot mark this function with __THROW.*/

3. extern int pthread_join (pthread_t __th, void **__thread_return);

/* Make calling thread wait for termination of the thread TH. The exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN is not NULL. This function is a cancellation point and therefore not marked with __THROW. */

例子代码:
#include <stdio.h>
#include <pthread.h>

void thread(void) {
for(int i = 0; i < 3; i++) {
printf(”this is a pthread!\n”);
}
}

int main() {
pthread_t id;
int ret = pthread_create(&id, NULL, (void* (*)(void*))thread, NULL);
if(ret != 0) {
printf(”create pthread error!\n”);
exit(1);
}

for(int i = 0; i < 3; i++) {
printf(”this is main thread!\n”);
}

printf(”test1\n”);
pthread_join(id, NULL);
printf(”test2\n”);

return EXIT_SUCCESS;
}

pthread_t //线程标识

Page 1 of 3123»