» »

[C++] Niti in mutex

[C++] Niti in mutex

techfreak :) ::

Pozdrav,

pri spodnji kodi (delno pisana na pamet) me zanima če bi kaj takšnega delovalo brez problemov:
class serial_listener : public module {
	private:
		pthread_mutex_t *pMutex;
		std::queue<std::string>to_send;
	
	public:
		serial_listener()
		{
			this->pMutex = new pthread_mutex_t;
			pthread_mutex_init(this->pMutex, NULL);
		}
		
		virtual void run()
		{
			while(1)
			{
				std::string niz = "";
				
				pthread_mutex_lock(this->pMutex);
				if(this->to_send.size()>0) {
					niz = this->to_send.front();
					this->to_send.pop();
				}
				pthread_mutex_unlock(this->pMutex);
				
				...
		}
		
		void add_item(std::string niz) {
			pthread_mutex_lock(this->pMutex);
			this->to_send.push(niz);
			pthread_mutex_unlock(this->pMutex);
		}
};

serial_listener *listener = new serial_listener;
listener->start();


Razred module ima metodo, ki zažene run() tega razreda v niti. Zanima me, če lahko jaz brez problemov iz drugih niti kličem listener->add_item("tekst") ?

module::start() zažene nit z:
if((success=pthread_create(&this->thread, NULL, start_thread, this))) {

Funkcija start_thread:
void *start_thread(void *p) {
	module *m = (module*)p;
	m->run();
}


Če prav razumem listener kaže na objekt, ki ima metodo add_item, ob klicu te metode pa nikakor ne vplivam (če odmislimo kaj se dogaja ko je mutex zaklenjen) na sam objekt.

Vesoljc ::

na prvi pogled bi moralo ja. pac queue-ja se dotikas samo cez zaklenjen mutex.
Abnormal behavior of abnormal brain makes me normal...

Mavrik ::

Delalo bi ja.

Predlagane izboljšave:

- Uporaba scoped locka, da te kak exception ne preseneti (če imaš možnost uproabljati C++11 namesto pthread)
- Thread, ki čaka na rezultate se ti bo vrtel zelo hitro in s tem kuril veliko CPU. Priporočam da pri čakanju uporabiš pthread_cond_wait in pri dodajanju potem "zbudiš" drug thread z pthread_cond_signal.
The truth is rarely pure and never simple.

terryww ::

in zakaj se otepate modela lmaxovega disruptorja (hecen ring buffer)?
It is the night. My body's weak.
I'm on the run. No time to sleep.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Niti - segmentation fault

Oddelek: Programiranje
211935 (782) galu
»

android črta

Oddelek: Programiranje
412370 (1641) g333kk
»

POMOČ: C# Spremenitev spremenljivke medtem ko teče ukaz while

Oddelek: Programiranje
91618 (1375) Ericssony
»

Qt Designer -> KDevelop C++ Error

Oddelek: Programiranje
352100 (1630) 'FireSTORM'
»

[C++] threading in random, dostop do rama

Oddelek: Programiranje
5919 (812) popec

Več podobnih tem