Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 23.08.2009, 22:35 Titel: threadsichere Befehle |
|
|
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
Mir persönlich gehts dabei hauptsächlich um die fbgfx mit Line, DrawString, Inkey usw. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 25.08.2009, 11:08 Titel: |
|
|
ich glaub da will dir keiner drauf antworten .. ist für mich eigentlich genauso interessant! .. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 25.08.2009, 11:26 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 25.08.2009, 14:23 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 25.08.2009, 14:39 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 25.08.2009, 20:00 Titel: |
|
|
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 |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 27.08.2009, 15:54 Titel: |
|
|
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 |
|
 |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 27.08.2009, 20:33 Titel: |
|
|
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 |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 27.08.2009, 21:39 Titel: |
|
|
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 |
|
 |
|