首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

pthread_setcurrency生效有关问题

2013-01-05 
pthread_setcurrency生效问题UNPV2 129页set_concurrency无法生效。我的虚拟机是单核,Ubuntu 2.6.32-36-gen

pthread_setcurrency生效问题
UNPV2 129页set_concurrency无法生效。我的虚拟机是单核,Ubuntu 2.6.32-36-generic。pthread_getconcurrency为0,set以后返回值正确;再次get也是正确的。程序执行还是单线程执行。
看网上说,多核涉及到绑定CPU,不是很理解。 我的是单核,应该不存在绑定CPU的问题。哪位大侠科普一下


#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sched.h>

#define MAXITEMS100*10000
#define MAXTHREADS100
#define min(a, b)  a<b?a:b

int nitems;
struct {
pthread_mutex_t mutex;
int buff[MAXITEMS];
int nput;
int nval;
}shared = {PTHREAD_MUTEX_INITIALIZER};
void *producer(void*), *consumer(void*);


struct Node{
int count;
int num;
};

int main(int argc, char **argv)
{
int i, nthreads;
struct Node count[MAXTHREADS];

pthread_t tid_producer[MAXTHREADS], tid_consumer;

if(argc != 3)
printf("usage: %s items threads!\n", argv[0]),exit(0);


nitems = min(atoi(argv[1]), MAXITEMS);
nthreads = min(atoi(argv[2]), MAXTHREADS);
printf("nitems=%d, nthreads=%d\n", nitems, nthreads);


//for more CPUS, must bind to one cpu 
int level = pthread_getconcurrency();
printf("getconcurrency = %d\n", level);

if(pthread_setconcurrency(nthreads) != 0)
printf("setconcurrency error:%d,%s\n", errno, strerror(errno)), exit(0);
else{
level = pthread_getconcurrency(nthreads);
printf("after set=%d, getconcurrency = %d\n", nthreads, level);
}



for(i=0;i<nthreads;++i){
count[i].num = i;
count[i].count = 0;
if(pthread_create(&tid_producer[i], NULL, producer, &count[i]) != 0)
printf("create pthread %d error: %d,%s\n", i, errno, strerror(errno)), exit(0);
}

for(i=0;i<nthreads;++i){
pthread_join(tid_producer[i], NULL);
printf("[%d]  num[%d] = %d\n", i, count[i].num, count[i].count);
}


pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_consumer, NULL);

//sleep(100);

return 0;
}


void* producer(void *arg)
{
pthread_t pid = pthread_self();
//printf("create pthread %x, val=%d\n", (unsigned int)arg, *(int*)arg);
//sleep(1);
struct Node *p = (struct Node*)arg;
printf("num[%d] = %d\n",  p->num, p->count);
while(1){
pthread_mutex_lock(&shared.mutex);
if(shared.nput >= nitems){
pthread_mutex_unlock(&shared.mutex);
return NULL;
}

shared.buff[shared.nput] = shared.nval;
++shared.nput;
++shared.nval;
//printf("running pthread %x\n", (unsigned int)arg);
pthread_mutex_unlock(&shared.mutex);
p->count++;
}

}


void* consumer(void* arg)
{
int i;
for(i=0;i<nitems;++i){
if(shared.buff[i] != i)
printf("buff[%d] = %d\n", i, shared.buff[i]);
}

return NULL;
}




我测试,超过四个线程以后,总是第四个线程执行
[解决办法]
Linux? 建议好好看一下man

       The default concurrency level is 0.

       Concurrency levels are only meaningful for M:N threading implementations, where at any moment a subset of a process's set  of  user-level  threads may be bound to a smaller number of kernel-scheduling entities.  Setting the concurrency level allows the application to give the system a hint as to the number of kernel-scheduling entities that should be provided for efficient execution of the application.

       Both LinuxThreads and NPTL are 1:1 threading implementations, so setting the concurrency level has no meaning.  In other  words,  on  Linux  these functions merely exist for compatibility with other systems, and they have no effect on the execution of a program.

热点排行