CreateThread与pthread

电脑杂谈  发布时间:2019-07-04 03:05:53  来源:网络整理

pthread_create 参数_pthread_create线程_pthread_create 第一个参数

创建线程

在 Windows 中,您可以使用 CreateThread() 来创建线程,创建的线程在调用进程的虚拟地址空间中运行。

HANDLE CreateThread(

LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD

SIZE_T dwStackSize, // initial stack size

LPTHREAD_START_ROUTINE lpStartAddress, // thread function

pthread_create 参数_pthread_create 第一个参数_pthread_create线程

LPVOID lpParameter, // thread argument

DWORD dwCreationFlags, // creation option

LPDWORD lpThreadId // thread identifier

);

lpThreadAttributes 是指向线程属性的指针,决定了线程句柄是否能由子进程继承。

Linux 使用 pthread 库调用 pthread_create() 来派生线程:

pthread_create 第一个参数_pthread_create 参数_pthread_create线程

int pthread_create (

pthread_t *thread_id,

pthread_attr_t *threadAttr,

void * (*start_address)(void *),

void * arg);

当使用fork系统 调用时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境,而使用pthread_create()来创建线程时,则最终设置了所 有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的"进程"拥有共享的运行环境,只有栈是独立的,由 __clone()传入。当使用fork系统 调用时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境,而使用pthread_create()来创建线程时,则最终设置了所 有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的"进程"拥有共享的运行环境,只有栈是独立的,由 __clone()传入。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为eagain和einval.前者表示系统限制创建新的线程,例如线程数目过多了。

pthread_create线程_pthread_create 参数_pthread_create 第一个参数

CreateThread() 中的 lpStartAddress 参数是刚创建的线程要执行的函数的地址。

由于pthread 库不是 linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,在编译中要加 -lpthread参数。当调用pthread_create()创建新线程后当前线程从pthread_create()返回继续往下执行,而新线程执行的代码由函数指针start_routine决定start_routine函数接受一个参数是由pthread_create()通过参数arg传递的,这个参数的类型是void *按什么类型解释由用户自己决定。先说说用getmodulehandle函数获取.此方法需要用createremotethread函数在远程进程中创建线程,让该线程调用kernel32.dll中的getmodulehandle函数.但是只这样还不行.因为getmodulehandle函数需要以dll模块文件名做参数.既然是远程线程调用getmodulehandle函数.还需要先把dll模块文件名写入目标进程的地址空间中.最后用createremotethread函数创建线程执行getmodulehandle函数来获取dll句柄。

在 Windows 中,系统调用 CreateThread() 的参数 lpParameter 指定了要传递给刚创建的线程的参数。它指明了将要传递给新线程的数据条目的地址。

由于pthread 库不是 linux 系统默认的库pthread_create 参数,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数建立fork处理程序时,在编译中要加 -lpthread参数。由于pthread 库不是 linux 系统默认的库,连接时需要使用静态库 libpthread.a,所以在使用pthread_create()创建线程,以及调用 pthread_atfork()函数时,在编译中要加 -lpthread参数。由于pthread库不是linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时pthread_create 参数,在编译中要加-lpthread参数:。

在 Windows 中,CreateThread() 的参数 dwStackSize 是将要分配给新线程的以字节为单位的栈大小。栈大小应该是 4 KB 的非零整数倍,最小为 8 KB。

在 Linux 中,栈大小程属性对象中设置;也就是说,将类型为 pthread_attr_t 的参数 threadAttr 传递给库调用 pthread_create()。在设置任何属性之前,需要通过调用 pthread_attr_init() 来初始化这个对象。使用调用 pthread_attr_destroy() 来销毁属性对象:

pthread_create 第一个参数_pthread_create线程_pthread_create 参数

int pthread_attr_init(pthread_attr_t *threadAttr);

int pthread_attr_destroy(pthread_attr_t *threadAttr);

为了区别是否是创建控件的线程访问该控件,windows应用程序中每一个控件对象都有一个invokerequired属性,用来检查是否需要通过调用invoke方法完成其他线程对该控件的操作,如果该属性为true.说明是其他线程操作该控件,这时可以创建一个委托实例,然后调用控件对象的invoke方法,并传入需要的参数完成相应操作,否则可以直接对该控件对象进行操作,从而保证了其他线程安全操作本线程中的控件.。为了区别是否是创建该控件的线程访问该控件,windows窗体控件中的每个控件都有一个invokerequired属性,这个属性就是用来检查本控件是否被其他线程调用的属性,当被创建该线程外的线程调用的时候invokerequired就为true。当使用fork系统 调用时,内核调用do_fork()不使用任何共享属性,进程拥有独立的运行环境,而使用pthread_create()来创建线程时,则最终设置了所 有这些属性来调用__clone(),而这些参数又全部传给核内的do_fork(),从而创建的"进程"拥有共享的运行环境,只有栈是独立的,由 __clone()传入。

通常情况下,缺省10m的线程栈空间显然是太大了,所以建议通过调用pthread_attr_setstacksize()api来改变线程栈的大小。pthread_attr_setstacksize()函数设置线程属性attr中栈大小属性值。dwstacksize:线程栈大小,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小(整数型)。

在 Windows 中,系统调用 ExitThread() 会终止线程。 dwExitCode 是线程的返回值,另一个线程通过调用 GetExitCodeThread() 就可以得到它。

VOID ExitThread(

DWORD dwExitCode // exit code for this thread

);

只应该在onmessage消息处理函数内部调用default调用缺省的窗口过程,它提供了对应用程序没有处理的任何窗口消息的缺省处理pretranslatemessage在消息被发送到windows函数translatemessage和dispatchmessage之前,cwinapp使用这个函数来过滤窗口消息sendmessage向cwnd对象发送一个消息,直到这条消息被处理之后才返回postmessage将一条消息放入应用程序的消息队列,然后不等窗口处理这条消息直接返回sendnotifymessage将一条消息发送到窗口并尽快返回,返回的速度取决于该窗口是否是由调用线程所创建。{2}中断向量返回后通过cortex-m的咬尾中断机制直接进入pendsv向量,pendsv构造一个假的异常堆栈,通过这个假的异常堆栈程环境下调用hal_interrupt_end函数,从pendsv返回后,因为假的异常堆栈的存在并不返回当前线程被中断的代码处继续执行,而是返回到hal_interrupt_end函数,此外假的异常堆栈将hal_interrupt_end函数的返回点设置为hal_interrupt_end_done。如果仅仅是使用互斥量来同步,则就可能出现前面的忙等待(即使调用sched_yield也只是延迟了而已),而使用条件变量后,则线程就可以阻塞休眠了,直到需要的条件发生(在这里就是nready.nready的值非零),而改变这个条件的线程也是通过条件变量(以条件变量做为参数调用pthread_cond_signal或pthread_cond_broadcast)来通知阻塞在相应条件变量的线程。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-110332-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 冯首宸
        冯首宸

        我家三兄弟

      • 何风
        何风

        后来部分资金20W跟他做了两次后才追加的

      热点图片
      拼命载入中...