线程创建代码

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#ifndef T_DESC
#define T_DESC(x, y)   (y)
#endif

#if T_DESC("global", 1)
pid_t gettid(void)
{
    return syscall(SYS_gettid);
}
#endif

#if T_DESC("TU1", 1)
void thread_1(void)
{
    int i;  

    for(i=0; i<10; i++)  {
        printf("thread_1: pid=0x%x tid=0x%x self=0x%x\n", getpid(), gettid(), (int)pthread_self());
        sleep(1);
    }
    pthread_exit(0);
}  

void thread_2(void)
{
    int i;  

    for(i=0; i<5; i++) {
        printf("thread_2: pid=0x%x tid=0x%x self=0x%x\n", getpid(), gettid(), (int)pthread_self());
        sleep(1);
    }
    pthread_exit(0);
}  

int tu1_proc(void)
{
    pthread_t id_1,id_2;
    int ret;
    unsigned long stack_size;
    pthread_attr_t attr;
    struct sched_param sched;

    pthread_attr_init(&attr);
    sched.sched_priority = 80;
    //pthread_attr_setschedpolicy(&attr, SCHED_OTHER);
    pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
    //pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED); //会导致线程创建失败

    pthread_attr_getstacksize(&attr, &stack_size);
    printf("default stack size is %ld(k)\n", stack_size/1024);

    printf("SCHED_FIFO: Max %u, Min %u\n", sched_get_priority_max(SCHED_FIFO), sched_get_priority_min(SCHED_FIFO));
    printf("SCHED_RR: Max %u, Min %u\n", sched_get_priority_max(SCHED_RR), sched_get_priority_min(SCHED_RR));
    printf("SCHED_OTHER: Max %u, Min %u\n", sched_get_priority_max(SCHED_OTHER), sched_get_priority_min(SCHED_OTHER));

    ret = pthread_create(&id_1, &attr, (void *)thread_1, NULL);
    if(ret != 0)
    {
        printf("Create pthread error!\n");
        return -1;
    }  

    ret = pthread_create(&id_2, &attr, (void *)thread_2, NULL);
    if(ret != 0)
    {
        printf("Create pthread error!\n");
        return -1;
    }  

    printf("main: pid=0x%x tid=0x%x self=0x%x\n", getpid(), gettid(), (int)pthread_self());

    /*等待线程结束*/
    pthread_join(id_1, NULL);
    pthread_join(id_2, NULL);
    return 0;
}
#endif

#if T_DESC("TU2", 1)

#endif

#if T_DESC("global", 1)
void usage()
{
    printf("\n Usage: <cmd> <tu>");
    printf("\n    1 -- base case");
    printf("\n    2 -- todo ");
    printf("\n");
}

int main(int argc, char **argv)
{
    int ret;

    if(argc < 2) {
        usage();
        return 0;
    }

    int tu = atoi(argv[1]);
    if (tu == 1) ret = tu1_proc();

    return ret;
}
#endif

#if T_DESC("readme", 1)
/*
1, compile command
gcc -o thread.out pthread.c -lpthread

*/
#endif
时间: 2024-10-14 12:06:19

线程创建代码的相关文章

匿名内部类创建线程,简化线程创建代码

1 package cn.learn.thread.Thread; 2 /* 3 匿名内部类方式的实现线程的创建 4 5 匿名:没有名字 6 内部类:写在其他类的内部 7 8 作用:简化代码,不用单独写一个类,来设置线程任务 9 把子类继承父类,重写父类方法,创建子类对象合成一部完成 10 或者实现类实现接口,重写接口方法,创建实现类对象一部完成 11 匿名内部类的最终产物:子类/实现类对象,没有名字 12 13 格式: 14 new 父类/接口{ 15 重写父类/接口方法 16 } 17 18

iOS-Senior10-多线程(子线程创建)

1.多线程概述 程序:由源代码生成的可执行应用.(eg:QQ.app) 进程:一个正在运行的程序可以看做一个进程.(eg:正在运行的QQ就是一个进程),进程用用独立运行所需的全部资源. 线程:程序中独立运行的代码段.(eg:接收QQ消息的代码) 一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行. 1.1单线程 每个正在运行的程序(即进程),至少包含一个线程,这个线程就叫主线程. 主线程在程序启动时被创建,用于执行main函数. 只有一个主线程的

iOS开发——多线程OC篇&amp;(二)线程创建

创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMa

java 线程返回值,优先级,后台线程 示例代码

ava 线程返回值,休眠,优先级,后台线程  示例代码 package org.rui.thread.basic; import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Execu

多线程【Thread、线程创建】

主线程:执行主方法的线程,就叫做主线程 单线程程序:程序从mani开始从上到下依次运行 程序从main方法开始运行,JVM运行main方法,会找操作系统 开辟一条通向cpu的执行路径,cpu可以通过这条路径来执行main方法 这条路径有一个名字叫主(main)线程 创建线程方式一继承Thread类 实现步骤: 1.创建Thread类的子类 2.重写Thread类中的run方法,设置线程的任务 3.创建Thread类的子类对象 4.调用Thread类中的start方法开启一个新的线程,执行run方

java-多线程创建

Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: Tread thread = new Thread(); thread.start(); 在上面的例子中,我们并没有为线程编写运行代码,因此调用该方法后线程就终止了. 编写线程运行时执行的代码有两种方式:一种是创建 Thread 子类的一个实例并重写 run 方法,第二种是创建类的时候实现 Run

Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public class Thread implements Runnable { /* What will be run. */ private Runnable target; ...... /** * Causes this thread to begin execution; the Java Virtu

linux 线程创建

一.线程的概念    进程在各个独立的地址空间中运行,进程之间共享数据需要mmap或者进程间通信机制,本节我们学习如何在一个进程的地址空间中执行多个线程.    有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了场,如实现一个图形界面的下载软件,需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个" 等待-处理"的循环,可以用多线程实现,一个线程专门 负责与用户交互,另外几个线程每个线程负责和

理解Android线程创建流程(转)

/android/libcore/libart/src/main/java/java/lang/Thread.java /art/runtime/native/java_lang_Thread.cc /art/runtime/native/java_lang_Object.cc /art/runtime/thread.cc /system/core/libutils/Threads.cpp /system/core/include/utils/AndroidThreads.h /framewor