Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

threadsichere Befehle

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 23.08.2009, 22:35    Titel: threadsichere Befehle Antworten mit Zitat

Mal angelehnt an das: http://forum.qbasic.at/viewtopic.php?t=6691

Woran erkennt man, dass ein bestimmter Befehl threadsafe ist?

Sicher muss man da von Fall zu Fall unterscheiden, wie schon erwähnt wurde, aber nachdem ich mir jetzt den FB Source gezogen und etwas darin herumgesucht habe, kann ich nicht erkennen, weshalb Print threadsafe sein soll.

Frage deshalb, weil ich öfters mit Threads arbeite und ich jedes mal überlege, wo ich ein Mutex brauche und wo nicht.

Wenn also jemand weiß, woran das zu erkennen wäre, würde ich die einzelnen Dateien/Befehle im Source durchgehen und eine Liste der sicheren Befehle posten. Vielleicht sehe ich ja nur den Wald vor lauter Bäumen nicht mehr lachen

Mir persönlich gehts dabei hauptsächlich um die fbgfx mit Line, DrawString, Inkey usw.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 25.08.2009, 11:08    Titel: Antworten mit Zitat

ich glaub da will dir keiner drauf antworten traurig .. ist für mich eigentlich genauso interessant! ..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 25.08.2009, 11:26    Titel: Antworten mit Zitat

entweder in der referenz steht "threadsafe" oder nicht.


was für ne richtlinie erwartest du? "wenn der befehl mit p anfängt ist er threadsafe"? ;p das erkennt man halt nich vom hinschauen. anleitung lesen angesagt. wenn da steht threadsafe, dann ists threadsafe. wenn da nicht steht threadsafe muss man halt nachdenken ob mans an der stelle braucht und eventuell von hand mutexen.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 25.08.2009, 14:23    Titel: Antworten mit Zitat

Zitat:
aber nachdem ich mir jetzt den FB Source gezogen [...] habe, kann ich nicht erkennen, weshalb Print threadsafe sein soll.


Ich denke, er bzw wir erwarten keine "richtlinie" sondern ne technische beurteilung darüber warum etwas threadsafe sein soll obwohl es keinen hinweis im quellcode darauf gibt.

@MisterD: Tschuldigung das manche die Referenz nicht als von Gott-gegeben ansehen. Wir sind solche ketzer XD ..
Wenn man anfängt "referenzen" für wahrer zu halten als den Quellcode wirds vielleicht mal zeit die Quellcode an eine Kirchentür zu nageln XD
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 25.08.2009, 14:39    Titel: Antworten mit Zitat

Das Problem ist, dass in der Referenz selbst bei Print nicht da steht, dass es threadsafe ist.

Ich bin die Änderungen am Code druchgegangen und finde an einer Stelle einen "großen Schritt" in Richtung Threadsicherheit, der sich als einfach Kopie entpuppt, die aber garnichts bewirkt und die in jeder Datei in der fbgfx2 gemacht wurde.

Es ist einfach nicht zu erkennen, wo da was threadsafe sein soll.

Ich glaub eher, dass die ganze fbgfx unsicher ist, auch wenn es im englischen Forum hieß, dass Print sicher sein soll.

Ich werde jetzt einfach dazu übergehen, bei Threads einfach jeden gfx-Befehl mit Mutexen zu schützen, nützt ja nix.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 25.08.2009, 20:00    Titel: Antworten mit Zitat

rtlib/win32/fb_win32.h hat Folgendes geschrieben:
#ifdef MULTITHREADED
extern CRITICAL_SECTION __fb_global_mutex;
extern CRITICAL_SECTION __fb_string_mutex;
extern CRITICAL_SECTION __fb_mtcore_mutex;
# define FB_LOCK() EnterCriticalSection(&__fb_global_mutex)
# define FB_UNLOCK() LeaveCriticalSection(&__fb_global_mutex)
# define FB_STRLOCK() EnterCriticalSection(&__fb_string_mutex)
# define FB_STRUNLOCK() LeaveCriticalSection(&__fb_string_mutex)
# define FB_MTLOCK() EnterCriticalSection(&__fb_mtcore_mutex)
# define FB_MTUNLOCK() LeaveCriticalSection(&__fb_mtcore_mutex)
# define FB_TLSENTRY DWORD
# define FB_TLSALLOC(key) key = TlsAlloc( )
# define FB_TLSFREE(key) TlsFree( (key) )
# define FB_TLSSET(key,value) TlsSetValue( (key), (LPVOID)(value))
# define FB_TLSGET(key) TlsGetValue( (key))
#else
# define FB_MTLOCK()
# define FB_MTUNLOCK()
#endif


Das entspricht dem -mt Parameter, der Threadsicherheit herstellen soll.

Ich habe mal ein Programm geschrieben, dass Dateien in einem Ordner durchgeht und zählt, wie oft einer der Befehle darin vorkommt (ausgenommen die "unlock"s, weil die ja quasi bei jedem "lock" mit dabei sind).

Hier das Ergebnis:

gfxlib2 hat Folgendes geschrieben:
FB_LOCK libfb_gfx_lineinp.c 1
FB_LOCK libfb_gfx_lineinp_wstr.c 1

rtlib hat Folgendes geschrieben:
FB_LOCK fb.h 2
FB_TLSENTRY fb.h 4
FB_TLSALLOC fb.h 2
FB_TLSFREE fb.h 2
FB_TLSSET fb.h 2
FB_TLSGET fb.h 2
FB_LOCK fb_file.h 1
FB_STRLOCK fb_string.h 2
FB_TLSGET fb_thread.h 1
FB_LOCK libfb_array_tmpdesc.c 2
FB_LOCK libfb_con_lineinp.c 2
FB_LOCK libfb_con_lineinp_wstr.c 2
FB_LOCK libfb_con_readline.c 3
FB_LOCK libfb_data_readbyte.c 1
FB_LOCK libfb_data_readdouble.c 1
FB_LOCK libfb_data_readint.c 1
FB_LOCK libfb_data_readlong.c 1
FB_LOCK libfb_data_readshort.c 1
FB_LOCK libfb_data_readsingle.c 1
FB_LOCK libfb_data_readstr.c 1
FB_LOCK libfb_data_readubyte.c 1
FB_LOCK libfb_data_readuint.c 1
FB_LOCK libfb_data_readulong.c 1
FB_LOCK libfb_data_readushort.c 1
FB_LOCK libfb_data_read_wstr.c 1
FB_LOCK libfb_data_rest.c 1
FB_LOCK libfb_dev_com.c 6
FB_LOCK libfb_dev_cons_open.c 1
FB_LOCK libfb_dev_err_open.c 1
FB_LOCK libfb_dev_file_close.c 1
FB_LOCK libfb_dev_file_encod_open.c 1
FB_LOCK libfb_dev_file_encod_read.c 1
FB_LOCK libfb_dev_file_encod_readline.c 1
FB_LOCK libfb_dev_file_encod_readline_wstr.c 1
FB_LOCK libfb_dev_file_encod_read_wstr.c 1
FB_LOCK libfb_dev_file_encod_write.c 1
FB_LOCK libfb_dev_file_encod_write_wstr.c 1
FB_LOCK libfb_dev_file_eof.c 1
FB_LOCK libfb_dev_file_flush.c 1
FB_LOCK libfb_dev_file_lock.c 1
FB_LOCK libfb_dev_file_open.c 1
FB_LOCK libfb_dev_file_read.c 1
FB_LOCK libfb_dev_file_readline.c 2
FB_LOCK libfb_dev_file_readline_wstr.c 1
FB_LOCK libfb_dev_file_read_wstr.c 1
FB_LOCK libfb_dev_file_seek.c 1
FB_LOCK libfb_dev_file_tell.c 1
FB_LOCK libfb_dev_file_unlock.c 1
FB_LOCK libfb_dev_file_write.c 1
FB_LOCK libfb_dev_file_write_wstr.c 1
FB_LOCK libfb_dev_lpt.c 1
FB_LOCK libfb_dev_lpt_close.c 1
FB_LOCK libfb_dev_lpt_write.c 1
FB_LOCK libfb_dev_lpt_write_wstr.c 1
FB_LOCK libfb_dev_scrn.c 2
FB_LOCK libfb_dev_scrn_close.c 1
FB_LOCK libfb_dev_scrn_eof.c 2
FB_LOCK libfb_dev_scrn_init.c 1
FB_LOCK libfb_dev_scrn_read.c 1
FB_LOCK libfb_dev_scrn_read_wstr.c 1
FB_LOCK libfb_dev_stdio_close.c 1
FB_TLSGET libfb_error.c 5
FB_TLSGET libfb_error_getset.c 7
FB_TLSFREE libfb_exit.c 1
FB_LOCK libfb_file_close.c 1
FB_LOCK libfb_file_eof.c 1
FB_LOCK libfb_file_get.c 1
FB_LOCK libfb_file_inputstr.c 1
FB_TLSGET libfb_file_input_con.c 1
FB_LOCK libfb_file_input_file.c 1
FB_TLSGET libfb_file_input_file.c 1
FB_TLSGET libfb_file_input_tok.c 1
FB_TLSGET libfb_file_input_tok_wstr.c 1
FB_LOCK libfb_file_lineinp.c 1
FB_LOCK libfb_file_loc.c 1
FB_LOCK libfb_file_lock.c 2
FB_LOCK libfb_file_openshort.c 1
FB_LOCK libfb_file_put.c 1
FB_LOCK libfb_file_putback.c 1
FB_LOCK libfb_file_putback_wstr.c 1
FB_LOCK libfb_file_reset.c 1
FB_LOCK libfb_file_seek.c 1
FB_LOCK libfb_file_size.c 1
FB_LOCK libfb_file_tell.c 1
FB_LOCK libfb_file_tree.c 1
FB_LOCK libfb_file_winputstr.c 1
FB_LOCK libfb_hook_cls.c 1
FB_LOCK libfb_hook_color.c 1
FB_LOCK libfb_hook_getsize.c 1
FB_LOCK libfb_hook_getx.c 1
FB_LOCK libfb_hook_getxy.c 1
FB_LOCK libfb_hook_gety.c 1
FB_LOCK libfb_hook_inkey.c 3
FB_LOCK libfb_hook_lineinp.c 1
FB_LOCK libfb_hook_lineinp_wstr.c 1
FB_LOCK libfb_hook_locate_ex.c 1
FB_LOCK libfb_hook_mouse.c 2
FB_LOCK libfb_hook_multikey.c 1
FB_LOCK libfb_hook_pageset.c 1
FB_LOCK libfb_hook_pcopy.c 1
FB_LOCK libfb_hook_ports.c 2
FB_LOCK libfb_hook_printstr.c 1
FB_LOCK libfb_hook_print_wstr.c 1
FB_LOCK libfb_hook_readxy.c 1
FB_LOCK libfb_hook_sleep.c 1
FB_LOCK libfb_hook_view_update.c 1
FB_LOCK libfb_hook_width.c 1
FB_TLSALLOC libfb_init.c 1
FB_LOCK libfb_io_lpos.c 1
FB_LOCK libfb_io_print.c 1
FB_LOCK libfb_io_printusg.c 2
FB_TLSGET libfb_io_printusg.c 5
FB_LOCK libfb_io_print_wstr.c 1
FB_LOCK libfb_io_setpos.c 1
FB_LOCK libfb_io_spc.c 2
FB_LOCK libfb_io_widthdev.c 2
FB_LOCK libfb_io_widthfile.c 1
FB_LOCK libfb_io_writestr.c 1
FB_LOCK libfb_io_write_wstr.c 1
FB_LOCK libfb_qb_inkey.c 1
FB_STRLOCK libfb_str_assign.c 1
FB_STRLOCK libfb_str_comp.c 1
FB_STRLOCK libfb_str_concat.c 1
FB_STRLOCK libfb_str_core.c 2
FB_LOCK libfb_str_format.c 1
FB_STRLOCK libfb_str_format.c 1
FB_STRLOCK libfb_str_instr.c 1
FB_STRLOCK libfb_str_instrany.c 1
FB_STRLOCK libfb_str_instrrev.c 1
FB_STRLOCK libfb_str_instrrevany.c 1
FB_STRLOCK libfb_str_lcase.c 1
FB_STRLOCK libfb_str_left.c 1
FB_STRLOCK libfb_str_ltrim.c 1
FB_STRLOCK libfb_str_ltrimany.c 1
FB_STRLOCK libfb_str_ltrimex.c 1
FB_STRLOCK libfb_str_mid.c 1
FB_STRLOCK libfb_str_midassign.c 1
FB_STRLOCK libfb_str_right.c 1
FB_STRLOCK libfb_str_rtrim.c 1
FB_STRLOCK libfb_str_rtrimany.c 1
FB_STRLOCK libfb_str_rtrimex.c 1
FB_STRLOCK libfb_str_tempdescf.c 1
FB_STRLOCK libfb_str_tempdescv.c 1
FB_STRLOCK libfb_str_tempdescz.c 1
FB_STRLOCK libfb_str_tempres.c 1
FB_STRLOCK libfb_str_trim.c 1
FB_STRLOCK libfb_str_trimany.c 1
FB_STRLOCK libfb_str_trimex.c 1
FB_STRLOCK libfb_str_ucase.c 1
FB_LOCK libfb_swap_mem.c 1
FB_LOCK libfb_sys_cdir.c 1
FB_STRLOCK libfb_sys_environ.c 1
FB_TLSSET libfb_thread_ctx.c 2
FB_TLSGET libfb_thread_ctx.c 2
FB_LOCK libfb_time_date.c 1
FB_LOCK libfb_time_now.c 1
FB_LOCK libfb_time_time.c 1
FB_LOCK libfb_vfs_open.c 1

rtlib/win32 hat Folgendes geschrieben:
FB_LOCK fb_win32.h 1
FB_STRLOCK fb_win32.h 1
FB_MTLOCK fb_win32.h 2
FB_TLSENTRY fb_win32.h 1
FB_TLSALLOC fb_win32.h 1
FB_TLSFREE fb_win32.h 1
FB_TLSSET fb_win32.h 1
FB_TLSGET fb_win32.h 1
FB_LOCK libfb_dev_pipe_close.c 1
FB_LOCK libfb_dev_pipe_open.c 1
FB_STRLOCK libfb_file_dir.c 1
FB_TLSGET libfb_file_dir.c 3
FB_LOCK libfb_file_resetex.c 1
FB_STRLOCK libfb_intl_conv_w32.c 2
FB_LOCK libfb_io_input.c 6
FB_LOCK libfb_io_printbuff.c 1
FB_LOCK libfb_io_printbuff_wstr.c 1
FB_STRLOCK libfb_sys_exec.c 1
FB_MTLOCK libfb_thread_cond.c 1


Sollte schon das richtige vorgehen sein, oder?
Ich würde interpretieren, dass überall, wo ein FB_LOCK ist, auch Threadsicherheit bei Parameter -mt bestehen sollte.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 27.08.2009, 15:54    Titel: Antworten mit Zitat

Gleiche Befehle gelten auch für Unix und Dos, also hier auch die Ergebnisse dazu:

rtlib/unix hat Folgendes geschrieben:
FB_LOCK fb_unix.h 1
FB_STRLOCK fb_unix.h 1
FB_TLSENTRY fb_unix.h 1
FB_TLSALLOC fb_unix.h 1
FB_TLSFREE fb_unix.h 1
FB_TLSSET fb_unix.h 1
FB_TLSGET fb_unix.h 1
FB_LOCK libfb_dev_pipe_close.c 1
FB_LOCK libfb_dev_pipe_open.c 1
FB_LOCK libfb_drv_intl_getmonthname.c 1
FB_LOCK libfb_drv_intl_getweekdayname.c 1
FB_STRLOCK libfb_file_dir.c 1
FB_TLSGET libfb_file_dir.c 4
FB_LOCK libfb_file_resetex.c 1
FB_STRLOCK libfb_sys_exec.c 1


rtlib/dos hat Folgendes geschrieben:
FB_LOCK fb_dos.h 1
FB_STRLOCK fb_dos.h 1
FB_TLSENTRY fb_dos.h 1
FB_TLSALLOC fb_dos.h 1
FB_TLSFREE fb_dos.h 1
FB_TLSSET fb_dos.h 1
FB_TLSGET fb_dos.h 1
FB_LOCK libfb_dev_pipe_close.c 1
FB_LOCK libfb_dev_pipe_open.c 1
FB_TLSGET libfb_file_dir.c 2
FB_LOCK libfb_file_resetex.c 1
FB_LOCK libfb_io_printbuff.c 1
FB_STRLOCK libfb_sys_exec.c 1
FB_LOCK libfb_sys_isr.c 2
FB_LOCK libfb_time_sleep.c 1


Auch in Xbox war nochw as zu finden:

rtlib/xbox hat Folgendes geschrieben:
FB_STRLOCK libfb_file_dir.c 1


Mehr war nicht zu holen, vielleicht hilft es ja dem ein oder anderen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 27.08.2009, 20:33    Titel: Antworten mit Zitat

MOD hat Folgendes geschrieben:
Gleiche Befehle gelten auch für Unix und Dos

Ich dachte immer bei Dos gäbe es keine multitasking/multithreading?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 27.08.2009, 21:39    Titel: Antworten mit Zitat

Da werden die Makros zwar definiert, haben aber vermutlich keinen Inhalt.
Mache ich beim OE-Exceptionhandler auch so. Für Windows gibts nen Excephandler, bei Linux sind die Makros einach leer...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz