收录日期:2020/04/07 12:23:33 时间:2016/07/30 11:19:25 标签:C++ 语言
求个linux多线程编程的例子,要有线程池的   通用些更好  
在《windows核心编程》中对线程池有详细介绍,如果要现成的,没有
有 java 的。
为何不用boost库里的线程池?
google下
http://wenku.baidu.com/view/ec4f071aff00bed5b9f31d91.html
http://www.pudn.com/downloads204/sourcecode/mpi/detail962809.html
抛砖引玉
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREADS 6
void *thread_function(void *arg);
int main() {
    int res;
    pthread_t a_thread[NUM_THREADS];
    void *thread_result;
    int lots_of_threads;
    for(lots_of_threads = 0; lots_of_threads < NUM_THREADS; lots_of_threads++) {
        res = pthread_create(&(a_thread[lots_of_threads]), NULL, thread_function, (void *)&lots_of_threads);
        if (res != 0) {
            perror("Thread creation failed");
            exit(EXIT_FAILURE);
        }
        sleep(1);
    }
    printf("Waiting for threads to finish...\n");
    for(lots_of_threads = NUM_THREADS - 1; lots_of_threads >= 0; lots_of_threads--) {
        res = pthread_join(a_thread[lots_of_threads], &thread_result);
        if (res == 0) {
            printf("Picked up a thread\n");
        }
        else {
            perror("pthread_join failed");
        }
    }
    printf("All done\n");
    exit(EXIT_SUCCESS);
}
void *thread_function(void *arg) {
    int my_number = *(int *)arg;
    int rand_num;
    printf("thread_function is running. Argument was %d\n", my_number);
    rand_num=1+(int)(9.0*rand()/(RAND_MAX+1.0));
    sleep(rand_num);
    printf("Bye from %d\n", my_number);
    pthread_exit(NULL);
}


main.cpp
#include "ThreadPool.h"
void* Fun(void* data)
{
//do something
//...
return NULL;
}
int main()
{
ThreadPool tp;
tp.Init(8, Fun);//pool size = 8
tp.AddTask((void*)"hello");
tp.AddTask((void*)"world");
return 0;
}


ThreadPool.h:

#ifndef _THREADPOOL_H_
#define _THREADPOOL_H_

#include <pthread.h>
#include <list>
#include <set>
#include <semaphore.h>
#include <string>
using namespace std;
#define MAX_SIZE 10240

class ThreadPool
{
friend void* DoTask(void*);
typedef void*(*ThreadFunction)(void*);
private:
list<string> m_lstTask;//task list, store the data
list<pthread_t*> m_lstThread;//thread list

sem_t m_sem;//notice the threads
pthread_mutex_t m_mutex;//

ThreadFunction m_threadFun; 
public:
~ThreadPool();
int Init(int maxSize, ThreadFunction threadFun);
public:
int AddTask(void* data);
private:
};


#endif


ThreadPool.cpp:

#include "ThreadPool.h"
#include <errno.h>
#include <iostream>
using namespace std;

typedef struct _task_struct
{
void* m_th;
char* m_str;

}TaskStruct;
void* DoTask(void* us)
{
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);        //允许退出线程   
// pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);   //设置立即取消   
TaskStruct* p_us = (TaskStruct*)us;
char* str_mem = p_us->m_str;
ThreadPool* tp = (ThreadPool*) p_us->m_th;
while (true)
{
if ( 0 != sem_wait(&tp->m_sem))
{
continue;
}
if ( 0 != pthread_mutex_lock(&tp->m_mutex))
{
continue;
}
string str = tp->m_lstTask.front();
strncpy(str_mem, str.c_str(), MAX_SIZE);
tp->m_lstTask.pop_front();
if ( 0 != pthread_mutex_unlock(&tp->m_mutex))
{
continue;
}
(*(tp->m_threadFun))(str_mem);
}
return 0;
}
ThreadPool::~ThreadPool()/*{{{*/
{
sem_destroy(&m_sem);
pthread_mutex_destroy(&m_mutex);
list<pthread_t*>::iterator it = m_lstThread.begin();
while (it != m_lstThread.end())
{
pthread_cancel(**it);
++it;
}
it = m_lstThread.begin();
while (it != m_lstThread.end())
{
delete *it++;
}
m_lstThread.clear();
}/*}}}*/

int ThreadPool::Init(int maxSize, ThreadFunction threadFun)/*{{{*/
{
if (0 != sem_init(&m_sem, 0, 0))// share among proc, init value
{
return -1;
}
if (0 != pthread_mutex_init(&m_mutex, NULL))
{
return -1;
}
m_threadFun = threadFun;
pthread_attr_t pat;
pthread_attr_init(&pat);
pthread_attr_setdetachstate(&pat, PTHREAD_CREATE_DETACHED);
for (int i = 0; i < maxSize; ++i)
{
pthread_t* pThread = new pthread_t();
TaskStruct* us = new TaskStruct();
us->m_th = this;
us->m_str = new char[MAX_SIZE];
if ( 0 != pthread_create(pThread, &pat, DoTask, us))
{
pthread_attr_destroy(&pat);
return -1;
}
m_lstThread.push_back(pThread);
}
pthread_attr_destroy(&pat);
return 0;
}/*}}}*/

int ThreadPool::AddTask(void* data)/*{{{*/
{
if ( 0 != pthread_mutex_lock(&m_mutex))
{
return -1;
}
m_lstTask.push_back((char*)data);
if ( 0 != sem_post(&m_sem))
{
m_lstTask.pop_back();
}
if ( 0 != pthread_mutex_unlock(&m_mutex))
{
return -1;
}
return 0;
}/*}}}*/


        pthread_mutex_lock();   
        pthread_cond_wait();   
        pthread_mutex_unlock(); 

int pthread_cond_wait(pthread_cond_t *cv,
pthread_mutex_t *mutex);
返回值:函数成功返回0;任何其他返回值都表示错误
函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。


这个pthread_cond_wait到底有没有pthread_mutex_unlock功能呀,上面书上的解释我迷了"函数将解锁mutex参数指向的互斥锁"?
还不如直接去看boost的thread和threadpool

win98下的放入光盘后光驱盘符由一个变成了两个. 怎样在asp.net中实现打印!!! 关于打印工资条问题. CSDN的高手们,给个答案阿!!-----在线等待,急用 数据库中值为null,在asp代码中怎么判断? 哈哈,升级了,终于可以散200分了,限20名,头5名20分,后5名10分,后10名5分。 困惑我很久的问题 CSDN的高手们,给个答案阿!!-----在线等待,急用 哈哈,升级了,终于可以散200分了,限20名,头5名20分,后5名10分,后10名5分。 (修正版) 技术如手足,工作如衣服(转) 数据库容量问题 那们帮写段JAVA SCRIPT代吗?谢谢! 大家好,如何在jsp中防止用户本地提交表单数据? 急!关于多串口卡影响鼠标的问题 Borland Application Server(bas45.jar) 去哪找 求助!求助! 如何利用其他unit中操作VCL的代码? 大讨论(UP 有分)!! OCX 中接口方法参数中带一个任意类型的数据的实现 初学者的苦恼 有关Java Socket 问题 一个select查询的问题(很基础的)在线等待 有什么工具软件可以关闭打开的端口?哪能下载? 难道SQL Server2000与ACCESS的SQL语法会相差这么大!!!!请看!!!!! 关于CRC校验的问题! 在未装CB的机子如何才能连接数据库???急!!在线等待!!! jbuilder 5 enterpirse +ias 4.1 ,拜托大虾了啊。谁知道告诉偶一下啊 两个小问题 不想再做程序员了,大家给点建议! dbgrid的查询问题(急等) sql server 2000 在window2000 下怎么装 ??