多線程多進程

多進程

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
    pid_t child_pid;

    /* 創建一個子進程 */
    child_pid = fork();
    if(child_pid == 0)
    {
        sleep(2);
        printf("child pid\n");
    }
    else
    {
        sleep(1);
        printf("father pid\n");
    }

    return 0;
}

pid_t是進程號,是唯一表示進程的ID。

pid_t fork(void) 函數

包含的頭文件:

#include <sys/types.h>

#include <unistd.h>

調用fork可以創建一個全新的進程。這個系統調用對當前進程進行復制。在進程表裏創建一個新的項目,新項目的許多屬性與當前進程是相同的。新進程和原進程幾乎一模一樣,執行的也是相同的代碼,但新進程有自己的數據空間、自己的環境等。

程序調用了fork函數的時候被分成了兩個進程。在父進程裏,fork函數返回新進程的PID進程號,新進程則返回0,這個可以做爲區分父子進程的依據。

多線程

參數聲明

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

thread並非Linux系統的默認庫,而是POSIX線程庫。在Linux中將其作爲一個庫來使用,因此加上 -lpthread,若線程創建成功,則返回0。若線程創建失敗,則返回出錯編號,並且*thread中的內容是未定義的。
返回成功時,由tidp指向的內存單元被設置爲新創建線程的線程ID。attr參數用於指定各種不同的線程屬性。新創建的線程從start_rtn函數的地址開始運行,該函數只有一個萬能指針參數arg,如果需要向start_rtn函數傳遞的參數不止一個,那麼需要把這些參數放到一個結構中,然後把這個結構的地址作爲arg的參數傳入。

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

struct char_print_params
{
    char character;
    int count;
};

void *char_print(void *parameters)
{
    struct char_print_params *p = (struct char_print_params *)parameters;
    int i;

    for(i = 0; i < p->count; i++)
    {       
        sleep(1);
        printf("\n");
        fputc(p->character,stderr);
    }

    return NULL;
}

int main()
{
    pthread_t thread1_id;
    pthread_t thread2_id;
    struct char_print_params thread1_args;
    struct char_print_params thread2_args;

    thread1_args.character = 'x';
    thread1_args.count = 10;
    pthread_create(&thread1_id, NULL, &char_print, &thread1_args);

    thread2_args.character = 'o';
    thread2_args.count = 10;
    pthread_create(&thread2_id, NULL, &char_print, &thread2_args);

    pthread_join(thread1_id, NULL);
    pthread_join(thread2_id, NULL);

    printf("main thread\r\n");
    return 0;
}

線程同步與互斥

互斥

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);

/*也可以用下面的方式初始化*/
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_lock(&mutex);

/*  互斥   */
thread_flag = value;

pthread_mutex_unlock(&mutex);

條件變量

int thread_flag = 0;
pthread_mutex_t mutex;
pthread_cond_t thread_flag_cv;

void init_flag()
{
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&thread_flag_cv, NULL);
    thread_flag = 0;
}

void *thread_function(void *thread_flag)
{
    while(1)
    {
        pthread_mutex_lock(&mutex);
        while(thread_flag != 0 )
        {
            pthread_cond_wait(&thread_flag_cv, &mutex);
        }
        pthread_mutex_unlock(&mutex);

        do_work();
    }

    return NULL;
}

void set_thread_flag(int flag_value)
{
    pthread_mutex_lock(&mutex);
    thread_flag = flag_value;

    pthread_cond_signal(&thread_flag_cv);
    pthread_mutex_unlock(&mutex);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章