【融信app源码】【整站挖矿源码】【秋枫打印源码】pthread join 源码

时间:2024-12-24 06:59:05 编辑:微信小程序招聘源码 来源:友多多系统源码

1.os.path.join函数用法是什么?
2.pthread_join使用范例
3.pthread_join的使用范例

pthread join 源码

os.path.join函数用法是什么?

       结论:os.path.join函数是一个用于拼接路径的工具,它在操作系统路径处理中发挥重要作用,根据系统自动识别并使用合适的路径分隔符,如"/"或 "\"。让我们通过实例来直观了解其用法。

       当需要在代码中组合多个路径部分时,融信app源码例如:

       os.path.join("home", "me", "mywork")

       这个函数会根据操作系统环境自动调整路径分隔符。在Linux系统中,它会返回:

       "home/me/mywork"

       而在Windows系统中,它会生成:

       "home\me\mywork"

       这样就确保了跨平台的路径兼容性。

       然而,这个函数与`pthread_join`是两个完全不同的概念。`pthread_join`用于线程同步,整站挖矿源码它阻塞主线程直到指定线程完成。函数原型如下:

       pthread_join(thread: 线程标识符, retval: 用户定义的指针)

       它用于等待线程结束,并且要求被等待的线程是可join的。当线程已经结束,函数会立即返回,返回0表示成功,秋枫打印源码非0值代表错误。

       请确保在使用`os.path.join`时处理路径,而在处理线程同步时使用`pthread_join`。这两个函数在各自的领域内提供了不同的功能。

pthread_join使用范例

       在Linux中,处理线程结束的源码编写短视频方式有两种,一是函数结束,与之相关的线程也随之终止;二是通过pthread_exit直接结束。需要注意的是,一个线程只能被一个线程等待,多次调用pthread_join会导致ESRCH错误。默认情况下,mrp管理系统 源码线程创建后需要使用pthread_join回收资源,但可通过设置线程属性使其在退出时自动回收。

       下面是一个范例,展示了如何使用pthread_join来控制线程行为。在信号测试程序中,子线程被阻塞,等待主程序发送信号。主程序通过键盘输入控制子线程,输入'a'打印字符串,输入'q'则发送SIGUSR2信号使线程退出,然后等待线程结束并打印"finish"。

       在signaltest.c程序中,我们创建了一个子线程,它会等待主程序发送SIGUSR1或SIGUSR2信号。主程序通过scanf获取用户输入,发送相应信号并调用pthread_join来控制子线程的结束。

       示例代码如下:

       c

       #include

       #include

       //...其他头文件...

       void* mythread(void* p) {

        //...线程处理代码...

       }

       int main() {

        //...设置信号集和创建子线程...

        while (1) {

        //...用户输入控制线程行为...

        if ('q' == tmp) {

        pthread_kill(tid, SIGUSR2); //发送SIGUSR2信号

        pthread_join(tid, &status); //等待子线程结束

        printf("finish\n"); //主线程结束

        break;

        }

        }

        //...程序结束...

       }

       如果希望创建的线程在退出时自动回收资源,可以设置线程属性为detached。例如:

       c

       void *start_run(void *arg) {

        //...线程工作...

       }

       int main() {

        pthread_t thread_id;

        pthread_attr_t attr;

        pthread_attr_init(&attr);

        pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); //设置为detached

        pthread_create(&thread_id, &attr, start_run, NULL);

        //...主线程结束...

       }

       线程设置为joinable后,可以使用pthread_detach变为detached,但反之则不能。如果线程已经调用过pthread_join,再调用pthread_detach将无效。

pthread_join的使用范例

       ä¸€ä¸ªçº¿ç¨‹çš„结束有两种途径,一种是象我们下面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。另外需要说明的是,一个线程不能被多个线程等待,也就是说对一个线程只能调用一次pthread_join,否则只有一个能正确返回,其他的将返回ESRCH 错误。

       åœ¨Linux中,默认情况下是在一个线程被创建后,必须使用此函数对创建的线程进行资源回收,但是可以设置Threads attributes来设置当一个线程结束时,直接回收此线程所占用的系统资源,详细资料查看Threads attributes。

       èŒƒä¾‹ï¼š

       //signaltest.c  // 子线程阻塞,等待信号,然后输出字符串  // 主线程从键盘录入字符,给子线程发信号。 #include<stdio.h>#include<unistd.h>#include<signal.h>#include<pthread.h>#include<time.h>pthread_ttid; sigset_tset;voidmyfunc(){  printf(hello\n);}staticvoid*mythread(void*p){  intsignum; while(1){  sigwait(&set,&signum); if(SIGUSR1==signum) myfunc(); if(SIGUSR2==signum) {  printf(Iwillsleep2secondandexit\n); sleep(2); break; }}}intmain(){ chartmp;void*status;sigemptyset(&set);sigaddset(&set,SIGUSR1);sigaddset(&set,SIGUSR2);sigprocmask(SIG_SETMASK,&set,NULL);pthread_create(&tid,NULL,mythread,NULL);while(1){ printf(:);scanf(%c,&tmp);if('a'==tmp){ pthread_kill(tid,SIGUSR1);//发送SIGUSR1,打印字符串。}elseif('q'==tmp){ //发出SIGUSR2信号,让线程退出,如果发送SIGKILL,线程将直接退出。pthread_kill(tid,SIGUSR2);//等待线程tid执行完毕,这里阻塞。pthread_join(tid,&status);printf(finish\n);break;}elsecontinue;}return0;}运行结果:

       // 如果输入a,子线程打印hello,主程序继续等待输入;

       // 如果输入q,主程序等待子程序结束。子线程打印I will sleep 2 second and exit,并延时两秒后结束。主线程随之打印finish,程序结束。

       åœ¨å‰é¢æˆ‘们提到,可以通过pthread_join()函数来使主线程阻塞等待其他线程退出,这样主线程可以清理其他线程的环境。但是还有一些线程,更喜欢自己来清理退出的状态,他们也不愿意主线程调用pthread_join来等待他们。我们将这一类线程的属性称为detached。如果我们在调用pthread_create()函数的时候将属性设置为NULL,则表明我们希望所创建的线程采用默认的属性,也就是joinable。如果需要将属性设置为detached,则参考下面的例子: void*start_run(void*arg){ //dosomework}intmain(){ pthread_tthread_id;pthread_attr_tattr;pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&thread_id,&attr,start_run,NULL);pthread_attr_destroy(&attr);sleep(5);exit(0);}在线程设置为joinable后,可以调用pthread_detach()使之成为detached。但是相反的操作则不可以。还  有,如果线程已经调用pthread_join()后,则再调用pthread_detach()则不会有任何效果。