LINUX.ORG.RU

Mutex ничего не блокирует. Он может быть захвачен потоком. А тот, в свою очередь, может ждать освобождения mutex-а другим потоком.
Если ты задаёшь такие вопросы, то, скорее всего, ты плохо представляешь себе свою задачу.

sergio_nsk
()

Есть ли в Linux аналог блокировок чтения-записи фирмы Sun(могут устанавливаться как только для чтенияЮ так и только для записи)?

Задача ясна как никогда :), спасибо что напомнили.

Например есть очередь, хотелось бы, чтобы как можно большее кол-во потоков могло ее читать одновременно, причем блокировка должна быть только в случае записи. В Sun есть отдельно блокировки на запись или не чтение. Если использовать mutex, то такое поведение не получается - ресурс может или быть заблокированным или нет :(

anonymous
()
Ответ на: комментарий от anonymous

Смотри pthread_rwlock_*, правда от версии библиотеки зависит...

tarle
()

Вот поигрался с условными переменными и наткнулся на непонятное поведение:

//a.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <list>

using namespace std;

pthread_cond_t condx = PTHREAD_COND_INITIALIZER;
list<int> queue;

void* Servlet(void* ptr)
{
int i=0;
while(1) {
if(queue.size() > 3) {
printf("Sleep: queue.size > 3 [%d]\n", (int)pthread_self());
sleep(1);
printf("Continue...\n");
} else {
i++;
printf("push new item: %d [%d]\n", i, (int)pthread_self());
queue.push_back(i);
printf("Notify...\n");
pthread_cond_signal(&condx);
}
}
return NULL;
}

void* QueueManager(void* ptr)
{
while(1) {
if(!queue.empty()) {
printf("Pop item: %d [%d]\n",queue.front(), (int)pthread_self());
printf("delete item [%d]\n", (int)pthread_self());
queue.pop_front();
} else {
printf("I'm sleep! [%d]\n", (int)pthread_self());
pthread_cond_wait(&condx, NULL);
}
}
return NULL;
}

int main(void)
{
int i = 0;

pthread_t a_thread;
if( pthread_create(&a_thread, 0, Servlet, NULL) == 0 )
pthread_detach(a_thread);

pthread_t b_thread;
if( pthread_create(&b_thread, 0, QueueManager, NULL) == 0 )
pthread_detach(b_thread);

sleep(3600);

return 0;
}


$g++-3.2 a.cpp -lpthread
$./a.out
push new item: 1 [1026]
Notify...
push new item: 2 [1026]
Notify...
push new item: 3 [1026]
Notify...
push new item: 4 [1026]
Notify...
Sleep: queue.size > 3 [1026]
Pop item: 1 [2051]
delete item [2051]
Pop item: 2 [2051]
delete item [2051]
Pop item: 3 [2051]
delete item [2051]
Pop item: 4 [2051]
delete item [2051]
I'm sleep! [2051]
Continue...
push new item: 5 [1026]
Notify...
push new item: 6 [1026]
Notify...
push new item: 7 [1026]
Notify...
push new item: 8 [1026]
Notify...
Sleep: queue.size > 3 [1026]
Continue...
Sleep: queue.size > 3 [1026]
Segmentation fault

Объясните откуда Segmentation fault ????????????

anonymous
()

Вот поигрался с условными переменными и наткнулся на непонятное поведение:

//a.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <list>

using namespace std;

pthread_cond_t condx = PTHREAD_COND_INITIALIZER;
list<int> queue;

void* Servlet(void* ptr)
{
int i=0;
while(1) {
if(queue.size() > 3) {
printf("Sleep: queue.size > 3 [%d]\n", (int)pthread_self());
sleep(1);
printf("Continue...\n");
} else {
i++;
printf("push new item: %d [%d]\n", i, (int)pthread_self());
queue.push_back(i);
printf("Notify...\n");
pthread_cond_signal(&condx);
}
}
return NULL;
}

void* QueueManager(void* ptr)
{
while(1) {
if(!queue.empty()) {
printf("Pop item: %d [%d]\n",queue.front(), (int)pthread_self());
printf("delete item [%d]\n", (int)pthread_self());
queue.pop_front();
} else {
printf("I'm sleep! [%d]\n", (int)pthread_self());
pthread_cond_wait(&condx, NULL);
}
}
return NULL;
}

int main(void)
{
int i = 0;

pthread_t a_thread;
if( pthread_create(&a_thread, 0, Servlet, NULL) == 0 )
pthread_detach(a_thread);

pthread_t b_thread;
if( pthread_create(&b_thread, 0, QueueManager, NULL) == 0 )
pthread_detach(b_thread);

sleep(3600);

return 0;
}


$g++-3.2 a.cpp -lpthread
$./a.out
push new item: 1 [1026]
Notify...
push new item: 2 [1026]
Notify...
push new item: 3 [1026]
Notify...
push new item: 4 [1026]
Notify...
Sleep: queue.size > 3 [1026]
Pop item: 1 [2051]
delete item [2051]
Pop item: 2 [2051]
delete item [2051]
Pop item: 3 [2051]
delete item [2051]
Pop item: 4 [2051]
delete item [2051]
I'm sleep! [2051]
Continue...
push new item: 5 [1026]
Notify...
push new item: 6 [1026]
Notify...
push new item: 7 [1026]
Notify...
push new item: 8 [1026]
Notify...
Sleep: queue.size > 3 [1026]
Continue...
Sleep: queue.size > 3 [1026]
Segmentation fault

Объясните откуда Segmentation fault ????????????

anonymous
()

блин
атачиш дебугер - запускаешь и смотриш откуда segsegv

laban
()
Ответ на: комментарий от anonymous

Наводка: между проверкой условия и действием, соответсвующим условию, много чего может произойти.

sergio_nsk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.