⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 100.htm

📁 unix高级编程原吗
💻 HTM
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>123</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center">               ● UNIX网络编程                       (BM: clown)                </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p   align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="101.htm">下一篇</a>]
<hr><p align="left"><small>发信人: clown (梧桐叶), 信区: UNP <br>

标  题: 多线程访问互斥的程序 <br>

发信站: UNIX编程 (2001年10月11日22:15:54 星期四), 站内信件 <br>

  <br>

//一个线程建立链表节点,三个线程取走链表节点中的数据,然后删掉该节点。 <br>

//one thread put the data into a link tabel <br>

//three threads get the data from the link table and remove the node <br>

  <br>

#include <pthread.h> <br>

#include <errno.h> <br>

#include <time.h> <br>

#include <stdio.h> <br>

#include <stdlib.h> <br>

#include <unistd.h> <br>

  <br>

#define MAX_THREAD 3 <br>

#define MAX_TIME 1000 //nanosecond <br>

  <br>

struct link { <br>

    int number; <br>

    struct link *next; <br>

}; <br>

struct link *head = NULL; <br>



struct link *last = NULL; <br>

  <br>

//pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; <br>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; <br>

pthread_mutex_t mutex_done = PTHREAD_MUTEX_INITIALIZER; <br>

pthread_cond_t cond_var = PTHREAD_COND_INITIALIZER; <br>

  <br>

int requests = 0;  //how many node created <br>

int done = 0; //the thread should exit? <br>

  <br>

void add_node(int number, pthread_mutex_t *pmutex, pthread_cond_t *pcond) <br>

{ <br>

    pthread_t tid; <br>

    struct link *p; <br>

  <br>

    p = (struct link *)malloc(sizeof(struct link)); <br>

    if(p == NULL) { <br>

        printf("malloc failed, out of memory.\n"); <br>

        exit(1); <br>

    } <br>

    p->number = number; <br>

    p->next = NULL; <br>



    tid = pthread_self(); <br>

  <br>

    if(pthread_mutex_lock(pmutex) == 0) { <br>

        //lock succeed <br>

        if(head == NULL) { <br>

            head = last = p; <br>

        } else { <br>

            last->next = p; <br>

            last = p; <br>

        } <br>

        requests++; <br>

        printf("Thread %d, add node number %d\n", tid, number); <br>

        //fflush(stdout); <br>

        //unlock <br>

        pthread_mutex_unlock(pmutex); <br>

        //communication with the other thread <br>

        pthread_cond_signal(pcond); <br>

    } else { <br>

        perror("lock failed in add_node"); <br>

    } <br>

} <br>

  <br>

  <br>

void del_node(pthread_mutex_t *pmutex) <br>

{ <br>

    pthread_t tid; <br>

    struct link *p; <br>

    if(requests > 0) { <br>

        p = head; <br>

        head = head->next; <br>

        if(head == NULL) <br>

            last = NULL; <br>

        requests--; <br>

        tid = pthread_self(); <br>

        printf("Thread %d, del node number %d\n", tid, p->number); <br>

        //fflush(stdout); <br>

        free(p); <br>

    } <br>

} <br>

  <br>

void *handle_loop() <br>

{ <br>

    if(pthread_mutex_lock(&mutex) != 0) { <br>

        perror("lock failed in handle_loop"); <br>

        return; <br>



    } <br>

    while(1) { <br>

        if(requests > 0) { <br>

            del_node(&mutex); <br>

        } else { <br>

            //unlock->wait->node create->lock->return <br>

            pthread_cond_wait(&cond_var, &mutex); <br>

        } <br>

        pthread_mutex_lock(&mutex_done); <br>

        if(done) { <br>

            pthread_mutex_unlock(&mutex_done); <br>

            pthread_mutex_unlock(&mutex); <br>

            break; <br>

        } <br>

        pthread_mutex_unlock(&mutex_done); <br>

  <br>

    } <br>

    return; <br>

} <br>

  <br>

int main() <br>

{ <br>

{ <br>

    int i, random; <br>

    struct timespec delay; <br>

    pthread_t tid[MAX_THREAD]; <br>

    void *ret; <br>

  <br>

    //create the threads to get the data in link table <br>

    for(i=0; i<MAX_THREAD; i++) <br>

        pthread_create(&tid[i], NULL, handle_loop, NULL); <br>

  <br>

    for(i=0; i<30; i++) { <br>

        add_node(i, &mutex, &cond_var); <br>

        srand(time(NULL)); <br>

        random = rand() % MAX_TIME; <br>

        delay.tv_sec = 0; <br>

        delay.tv_nsec = random; <br>

        nanosleep(&delay, NULL); <br>

    } <br>

  <br>

    //wait the threads which is deleting the node in link table <br>

    pthread_mutex_lock(&mutex_done); <br>

    done = 1; <br>

    pthread_mutex_unlock(&mutex_done); <br>



    pthread_cond_broadcast(&cond_var); <br>

    for(i=0; i<MAX_THREAD; i++) { <br>

        if(pthread_join(tid[i], &ret) == 0) { <br>

            printf("tid[%d] = %d, return!\n", i, tid[i]); <br>

        } else { <br>

            perror("pthread_jion"); <br>

            break; <br>

        } <br>

    } <br>

  <br>

    printf("all done\n"); <br>

    return 0; <br>

} <br>

  <br>

  <br>

结果: <br>

Thread 1024, add node number 0 <br>

Thread 1026, del node number 0 <br>

Thread 1024, add node number 1 <br>

Thread 2051, del node number 1 <br>

Thread 1024, add node number 2 <br>

Thread 3076, del node number 2 <br>



Thread 1024, add node number 3 <br>

Thread 1026, del node number 3 <br>

Thread 1024, add node number 4 <br>

Thread 2051, del node number 4 <br>

Thread 1024, add node number 5 <br>

Thread 3076, del node number 5 <br>

Thread 1024, add node number 6 <br>

Thread 1026, del node number 6 <br>

Thread 1024, add node number 7 <br>

Thread 2051, del node number 7 <br>

Thread 1024, add node number 8 <br>

Thread 3076, del node number 8 <br>

Thread 1024, add node number 9 <br>

Thread 1026, del node number 9 <br>

Thread 1024, add node number 10 <br>

Thread 2051, del node number 10 <br>

Thread 1024, add node number 11 <br>

Thread 3076, del node number 11 <br>

Thread 1024, add node number 12 <br>

Thread 1026, del node number 12 <br>

Thread 1024, add node number 13 <br>

Thread 2051, del node number 13 <br>



Thread 1024, add node number 14 <br>

Thread 3076, del node number 14 <br>

Thread 1024, add node number 15 <br>

Thread 1026, del node number 15 <br>

Thread 1024, add node number 16 <br>

Thread 2051, del node number 16 <br>

Thread 1024, add node number 17 <br>

Thread 3076, del node number 17 <br>

Thread 1024, add node number 18 <br>

Thread 1026, del node number 18 <br>

Thread 1024, add node number 19 <br>

Thread 2051, del node number 19 <br>

Thread 1024, add node number 20 <br>

Thread 3076, del node number 20 <br>

Thread 1024, add node number 21 <br>

Thread 1026, del node number 21 <br>

Thread 1024, add node number 22 <br>

Thread 2051, del node number 22 <br>

Thread 1024, add node number 23 <br>

Thread 3076, del node number 23 <br>

Thread 1024, add node number 24 <br>

Thread 1026, del node number 24 <br>



Thread 1024, add node number 25 <br>

Thread 2051, del node number 25 <br>

Thread 1024, add node number 26 <br>

Thread 3076, del node number 26 <br>

Thread 1024, add node number 27 <br>

Thread 1026, del node number 27 <br>

Thread 1024, add node number 28 <br>

Thread 2051, del node number 28 <br>

Thread 1024, add node number 29 <br>

Thread 3076, del node number 29 <br>

tid[0] = 1026, return! <br>

tid[1] = 2051, return! <br>

tid[2] = 3076, return! <br>

all done <br>

  <br>

  <br>

  <br>

-- <br>

易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望, <br>

是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花, <br>

都是一个死亡唇边的微笑。 <br>

※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 202.114.1.61] <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="54.htm">上一层</a>][<a href="101.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -