如何在Windows和Linux下获取当前线程的ID号

如何在Windows和Linux下获取当前线程的ID号,第1张

Linux下获取当前线程ID号函数

pthread_t pthread_self()

返回:当前线程的ID号

pthread_t 数据类型的定义如下:

typedef unsigned long int pthread_t

sizeof(pthread_t) = 4,4个字节的整数。

Windows下获取当前线程ID号的函数:

DWORD GetCurrentThreadId()

返回值:当前线程的ID号

DWORD数据类型定义:

typedef unsigned long DWORD

在Windows下pthread-win库的pthread_t定义如下:

typedef struct {

void * p /*Pointer to actual object */

unsigned int x/*Extra information - reuse count etc */

} ptw32_handle_t

typedef ptw32_handle_t pthread_t

与Linux的thread_t不一样,它是一个结构,不是一个整数值

在Windows和Linux下可用的获取线程ID号的内联函数如下:

#ifdef WIN32

#include <windows.h>

#else

#include <pthread.h>

#endif

inline unsigned int PthreadSelf()

{

#ifdef WIN32

return::GetCurrentThreadId()

#else

returnthread_self()

#endif

}

通过查看资料,发现一种比较简单的方法就是在代码中使用printf将当前线程的id打印出来。

而这也分成两种情况:

1. 如果是pthread,则使用,

#include <pthread.h>

pthread_t pthread_self(void)

2. 如果不是pthread,即是由内核创建的线程,则使用,

#include <sys/types.h>

pid_t gettid(void)

获取线程所在的进程的id,方法如下:

#include <sys/types.h>

linux多线程

1.线程概述

线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。一个进程可以有多个线程,也就

是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。

2.线程实现

线程创建pthread_create()

所需头文件#include

<pthread.h>

函数原型int

pthread_create

((pthread_t

*thread,

pthread_attr_t

*attr,

thread:线程标识符

attr:线程属性设置

start_routine:线程函数的起始地址

arg:传递给start_routine的参数

函数返回值

成功:0

出错:-1

线程退出pthread_exit()

所需头文件#include

<pthread.h>

函数原型void

pthread_exit(void

*retval)

函数传入值retval:pthread_exit()调用者线程的返回值,可由其他函数如pthread_join

来检索获取

等待线程退出并释放资源pthread_join()

所需头文件#include

<pthread.h>

函数原型int

pthread_join

((pthread_t

th,

void

**thread_return))

函数传入值

th:等待线程的标识符

thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)

函数返回值

成功:0

出错:-1

代码举例

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

/*线程1*/

6.

void

thread1()

7.

{

8.

int

i=0

9.

10.

while(1)

11.

{

12.

printf(thread1:%d/n,i)

13.

if(i>3)

14.

pthread_exit(0)

15.

i++

16.

sleep(1)

17.

}

18.

}

19.

20.

/*线程2*/

21.

void

thread2()

22.

{

23.

int

i=0

24.

25.

while(1)

26.

{

27.

printf(thread2:%d/n,i)

28.

if(i>5)

29.

pthread_exit(0)

30.

i++

31.

sleep(1)

32.

}

33.

}

34.

35.

int

main()

36.

{

37.

pthread_t

t1,t2

38.

39.

/*创建线程*/

40.

pthread_create(&t1,NULL,(void

*)thread1,NULL)

41.

pthread_create(&t2,NULL,(void

*)thread2,NULL)

42.

/*等待线程退出*/

43.

pthread_join(t1,NULL)

44.

pthread_join(t2,NULL)

45.

return

0

46.

}

3同步与互斥

<1>互斥锁

互斥锁的 *** 作主要包括以下几个步骤。

互斥锁初始化:pthread_mutex_init

互斥锁上锁:pthread_mutex_lock

互斥锁判断上锁:pthread_mutex_trylock

互斥锁接锁:pthread_mutex_unlock

消除互斥锁:pthread_mutex_destroy

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0/*共享变量*/

6.

pthread_mutex_t

mutex=PTHREAD_MUTEX_INITIALIZER/*互斥锁*/

7.

8.

void

thread1()

9.

{

10.

int

ret

11.

while(1)

12.

{

13.

14.

15.

ret=pthread_mutex_trylock(&mutex)/*判断上锁*/

16.

17.

if(ret!=EBUSY)

18.

{

19.

pthread_mutex_lock(&mutex)/*上锁*/

20.

printf(This

is

thread1:%d/n,i)

21.

i++

22.

pthread_mutex_unlock(&mutex)/*解锁*/

23.

}

24.

sleep(1)

25.

}

26.

}

27.

28.

void

thread2()

29.

{int

ret

30.

while(1)

31.

{

32.

33.

ret=pthread_mutex_trylock(&mutex)

34.

if(ret!=EBUSY)

35.

{

36.

pthread_mutex_lock(&mutex)

37.

printf(This

is

thread2:%d/n,i)

38.

i++

39.

pthread_mutex_unlock(&mutex)

40.

}

41.

sleep(1)

42.

}

43.

}

44.

int

main()

45.

{

46.

pthread_t

t1,t2

47.

pthread_mutex_init(&mutex,NULL)

48.

pthread_create(&t1,NULL,(void

*)thread1,NULL)

49.

pthread_create(&t2,NULL,(void

*)thread2,NULL)

50.

51.

pthread_join(t1,NULL)

52.

pthread_join(t2,NULL)

53.

54.

pthread_mutex_destroy(&mutex)

55.

return

0

56.

}

<2>信号量

未进行同步处理的两个线程

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0

6.

void

thread1()

7.

{

8.

9.

while(1)

10.

{

11.

printf(This

is

thread1:%d/n,i)

12.

i++

13.

sleep(1)

14.

}

15.

}

16.

17.

18.

void

thread2()

19.

{

20.

21.

while(1)

22.

{

23.

printf(This

is

thread2:%d/n,i)

24.

i++

25.

sleep(1)

26.

}

27.

}

28.

29.

int

main()

30.

{

31.

pthread_t

t1,t2

32.

33.

pthread_create(&t1,NULL,(void

*)thread1,NULL)

34.

pthread_create(&t2,NULL,(void

*)thread2,NULL)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7482124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存