1. 程式人生 > 其它 >pthread執行緒

pthread執行緒

linux多執行緒

1. 標頭檔案

  • <pthread.h>

2. 編譯

  • gcc -o test test.c -lpthread

3. 變數

  • pthread_t
  • pthread_cond_t
  • pthread_mutex_t

4. 函式

  • pthread_create
  • pthread_join
  • pthread_exit
  • pthread_mutex_lock
  • pthread_mutex_unlock
  • pthread_cond_signal
  • pthread_cond_broadcast
  • pthread_cond_wait
  • pthread_cond_timewait

4.1 pthread_create

int pthread_create(pthread_t *pid, const pthread_attr_t * attr, void*(*func)(void),void*arg)
# 建立新執行緒
# pid:執行緒id
# attr:執行緒屬性,一般為空
# func:執行緒函式
# arg:執行緒函式引數
# 返回值:0,成功

4.2 pthread_join

int pthread_join(pthread_t pid, void**retval)
# 回收執行緒資源,父執行緒阻塞
# pid,執行緒id
# retval,執行緒返回值
# 返回值:0,成功

4.3 pthread_exit

void pthread_exit(void *val)
# 終止執行緒
# val,執行緒返回值

5. 測試程式碼

/* file:pthread_test.c
 * gcc -o pthread_test pthread_test.c -lpthread
 */

#include <stdio.h>
#include <pthread.h>

#define log(fmt,...) printf("%s:%d:"fmt"\n",__func__,__LINE__,##__VA_ARGS__)

pthread_cond_t		cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t 	cond_mutex = PTHREAD_MUTEX_INITIALIZER;

void *thread_test1(void *arg)
{
	pthread_mutex_lock(&cond_mutex);
	pthread_cond_wait(&cond,&cond_mutex);
	pthread_mutex_unlock(&cond_mutex);
	log("%s",(char*)arg);

	return NULL;
}

void *thread_test2(void *arg)
{
	pthread_mutex_lock(&cond_mutex);
	pthread_cond_signal(&cond);
	log("%s",(char*)arg);
	pthread_mutex_unlock(&cond_mutex);

	pthread_exit("exit pthread");
	return NULL;
}

int main()
{
	char *buf1="test thread1";
	char *buf2="test thread2";
	void *buf;

	pthread_t thread[2];

	pthread_create(&thread[0], NULL, thread_test1, (void *)buf1);

	pthread_create(&thread[1], NULL, thread_test2, (void *)buf2);

	pthread_join(thread[0],NULL);
	pthread_join(thread[1],&buf);
	
	log("%s",(char *)buf);

	return 0;
}