windows与linux多线程对比

 

一.创建线程

1>windows

HANDLE aThread[MAX_THREAD];

 函数原型:

 HANDLE WINAPI CreateThread(
      _In_opt_  LPSECURITY_ATTRIBUTES  lpThreadAttributes,   
      _In_      SIZE_T                 dwStackSize,
      _In_      LPTHREAD_START_ROUTINE lpStartAddress,
      _In_opt_  LPVOID                 lpParameter,
      _In_      DWORD                  dwCreationFlags,
      _Out_opt_ LPDWORD                lpThreadId
    );

 参数说明:

lpThreadAttributes  表示线程内核对象的安全属性;NULL表示使用默认设置;
dwStackSize      表示线程栈空间的大小;0表示使用默认大小(1MB);
lpStartAddress    表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址;
lpParameter      传给线程函数的参数;
dwCreationFlags    指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread();
lpThreadId      返回线程的ID号,NULL表示不需要返回该线程的ID号。


  线程创建成功返回新线程的句柄,不成功则返回NULL。

 

2>linux

pthread_t aThread[MAX_THREAD];

   函数原型:

int pthread_create(
        pthread_t*            tidp,
        const pthread_attr_t*      attr,
        void*               (*start_rtn)(void*),
        void*                arg
    );                            

 参数说明:

第一个参数为指向线程标识符的指针。
第二个参数用来设置线程属性。
第三个参数是线程运行函数的起始地址。
最后一个参数是运行函数的参数。

  若线程创建成功,则返回0。若线程创建失败,则返回出错编号。

 

二.创建信号量

1>windows

HANDLE CreateSemaphore(
    LPSECURITY_ATTRIBUTES     lpSemaphoreAttributes, 
    LONG              lInitialCount, 
    LONG             lMaximumCount, 
    LPCTSTR           lpName
);

  参数说明:

lpSemaphoreAttributes   信号量的属性,一般设置为NULL。
lInitialCount       信号量初始值,0~lpMaximumCount之间.如果lInitialCount 的初始值为0,则该信号量默认为unsignal状态;如果lInitialCount的初始值大于0,则该信号量默认为signal状态。
lMaximumCount       设置信号量的最大计数。
lpName             指定信号量对象的名称,NULL表示无名的信号量。

  

    成功返回信号量对象的句柄,失败返回NULL。

2>linux

int sem_init(sem_t *sem, int pshared, unsigned int value);

 参数说明:

sem      指向信号量对象
pshared   指明信号量的类型。不为0时,表示此信号量在进程间共享;为0时,表示只能为当前进程的所有线程共享。
value     信号量初始值

 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值。

 

三.操作信号量

1>windows

BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lReleaseCount,
LPLONG lpPreviousCount
);

  参数说明;

hSemaphore       所要操作的信号量对象的句柄,这个句柄是CreateSemaphore或者OpenSemaphore函数的返回值。这个句柄必须有SEMAPHORE_MODIFY_STATE 的权限。
lReleaseCount    这个信号量对象在当前基础上所要增加的值,这个值必须大于0,如果信号量加上这个值会导致信号量的当前值大于信号量创建时指定的最大值,那么这个信号量的当前值不变,同时这个函数返回FALSE;
lpPreviousCount  指向返回信号量上次值的变量的指针,如果不需要信号量上次的值,那么这个参数可以设置为NULL;


  成功返回TRUE;如果失败返回FALSE,可以调用GetLastError函数得到详细出错信息.

DWORD WINAPI WaitForSingleObject(
__in HANDLE hHandle,
__in DWORD dwMilliseconds
)

  参数说明;

hHandle        内核对象句柄,该句柄标识一个内核对象,如果该内核对象处于未通知状态,则该函数导致线程进入阻塞状态;如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0
dwMilliseconds    需要等待的时间(毫秒),可以传递INFINITE指明要无限期等待下去,如果第二个参数为0,那么函数就测试同步对象的状态并立即返回。

  如果等待超时,该函数返回WAIT_TIMEOUT。如果该函数失败,返回WAIT_FAILED。 

2>linux

int sem_post(sem_t *sem);

  成功时返回 0;错误时,信号量的值没有更改,-1 被返回,并设置 errno 来指明错误。

int sem_wait(sem_t *sem);

   成功时返回 0;错误时,信号量的值没有更改,-1 被返回,并设置 errno 来指明错误。

 

上一篇:Linux 进程间通信(system v 信号灯+system v 共享内存)实例


下一篇:20-30