Linux多线程 一

#include 
#include 
#include 
#include 
/*#########################################

1.创造新线程:
            1.线程ID
            2.创建线程
2.线程生命周期:
            1.初始线程、主线程
            2.线程创建
            3.线程的基本状态:
                            a.就绪:线程能够运行,但是在等待可用的处理器(刚创建、解除阻塞、线程被抢占)
                            b.运行:线程正在运行,多核系统中,可能同事多个线程在运行(处理器可用)
                            c.阻塞:线程在等待处理器以外的其他条件(如:试图加锁一个已经被锁的互斥量、等待某个条件变量、
                                    调用singwait等待尚未发生的信号、执行无法完成的I/O信号、内存页错误等)
                            d.终止:线程从启动函数中返回,或调用pthread_exit函数,或被取消
            4.回收:
                    线程分离属性: 就是通知该线程结束时其所属的资源可以回收。如过线程没有被分离则该线程会保留它的虚拟内存,
                                包括他们的堆栈和其他系统资源(僵尸线程),创建线程时默认是非分离的。
                    终止被分离的进程会释放所有系统资源(必须被解锁或没有线程等待,所以线程终止前必须解锁互斥量)
3.线程控制:
            1.线程终止:
                        a.exit是危险的
                        b.不终止进程的退出方式:
                                            1.从启动例程中返回,返回值是线程的退出码
                                            2.线程可以被同一进程中的其他线程取消
                                            3.线程调用pthread_exit(void *rval)函数,rval是退出码
            2.线程链接(pthread_join)
            3.线程取消:
                        a.取消函数(int pthread_cancel (pthread_t tid):取消只是只是一个请求,发送成功不代表会终止。
                        b.取消状态(int pthread_setcancelstate(int state,int *oldstate):
                                    state有两种值:PTHREAD-CANCEL-ENABLE(缺省)和PTHREAD-CANCEL-DISABLE。
                                    分别表示收到信号后设置为CANCLED状态和忽略CANCEL信号继续运行。
                                    old_state如果不为NULL则存入原来的Cancel状态以便恢复。

                        c.取消类型(int pthread_setcanceltype(int type ,int *oldtype)):
                                    type有两种取值:PTHREAD-CANCEL-DEFFERED和PTHREAD-CANCEL-ASYCHRONOUS,仅当cancel状态
                                    为enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);
                                    oldtype如果不为NULL则存入运来的取消动作类型值。

                        d.取消点:取消线程需要被取消线程的配合。线程在很多时候会查看自己是否有取消请求
                                    如果有就主动退出,这些查看是否有取消的地方为取消点。如:
                                    pthread_join/testcancel()
                                    prhread_cond_weid().pthread_cond_timedwait().sem_wait().sigwait().write.
                                    read等大多数阻塞的系统调用

            4.线程发送信号:
                            a.pthread_kill(int pthread_kill(pthread_t thread,int sig)向线程发送signal)
                            b.信号处理
            5.清除操作

############################################

%ld对应long,%d对应int 4字节,%u对应unsigned int,%f对应fload 4字节,
%lf对应double,%c对应char 1字节,%s对应char ×,%x对应16进制输出int。


const 修饰普通变量,表示常量不能修改
      const type *name :这种情况下,const修饰的指针变量name所指向的type类型对象,
      也就是说指向的这个对象是不能进行修改的,因为其是常量,而指针变量确实可以进行修改的。
      type * const name :这种情况下,const修饰的指针变量name,
      也就是说这个指针变量的值是不能进行修改的,但是指针变量所指向的对象确实可以修改的。

int pthread_create(pthread_t *thread,const pthread_attr_t *attr,
                    void *(*start_routine) (void *),void *arg);
    参1:新建线程id,成功则新id回填充到tidp指向的内存
    参2:新线程的属性(调度策略,继承性,分离性),NULL为默认属性
    参3:新线程要执行的指针函数(回调函数)
    参4:回调函数的参数


int pthread_join(pthread_t tid,void **rval)会使指定的线程处于分离状态。
调用该函数线程会一直阻塞,直到指定的线程tid调用pthread_exit。
参数rval是指定线程的返回码,如果线程取消则rval被置为    PTHREAD—CANCELED
该函数调用成功则返回0,
int pthread_detach(pthread_t thread);可以分离一个线程,自己分离自己。



#########################################*/

/*
void print_id(char *s)
{
    pid_t pid;
    pthread_t tid;
    pid=getpid();
    tid=pthread_self();
    printf(" pid is %u,tid is %x\n",pid,tid);
}

void *thread_fun(void *arg)
{
    print_id(arg);
    //return (void *)0;
}

int main()
{
    pthread_t ntid;
    int err;
    err=pthread_create(&ntid,NULL,thread_fun,"new thread");
    if(err != 0)
    {
        printf("failed\n");
        return 0;
    }

    print_id("");
    sleep(0);
    return 0;
}
*/
/*#############################################################
指针函数:函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。
函数指针:指向函数的指针


主线程中当main函数返回的时候,会结束所有进程,
可在主线程中调用pthread_exit函数,这样会等待所有线程结束
##############################################################*/
/*
struct student {
    int age;
    char name[20];
    char id[4];
};

void *thread_fun(void *stu)
{
    sleep(1);
    printf("student age is %d,name is %s,id is %s\n",((struct student *)stu) -> age,
                                ((struct student *)stu) -> name,((struct student *)stu) -> id);
}

int main(int argc,char *argv[])
{
    pthread_t tid;
    int err;
    int *rval;
    struct student stu;
    stu.age=20;
    memcpy(stu.name,"zz",20);
    memcpy(stu.id,"007",5);

    err = pthread_create(&tid,NULL,thread_fun,(void *)(&stu));
    if(err != 0)
    {
        printf("failed\n");
        return 0;
    }

    int i;
    printf("main thread have %d args\n",argc);
    for(i=0;i

 

gcc t.c -o t -lpthread

 

你可能感兴趣的:(Linux)